স্পষ্টতই, না।
এখানে বিকল্পগুলি:
Type.IsSubclassOf
আপনি ইতিমধ্যে খুঁজে পেয়েছেন যে, দুটি ধরণের একই রকম হলে এটি কাজ করবে না, এখানে একটি নমুনা লিনকিপ্যাড প্রোগ্রাম রয়েছে যা দেখায়:
void Main()
{
typeof(Derived).IsSubclassOf(typeof(Base)).Dump();
typeof(Base).IsSubclassOf(typeof(Base)).Dump();
}
public class Base { }
public class Derived : Base { }
আউটপুট:
True
False
যা ইঙ্গিত করে যে Derived
এটি একটি সাবক্লাস Base
, তবে এটি Base
(স্পষ্টতই) নিজের একটি সাবক্লাস নয়।
Type.IsAssignableFrom
এখন, এটি আপনার নির্দিষ্ট প্রশ্নের উত্তর দেবে, তবে এটি আপনাকে মিথ্যা ধনাত্মকতাও দেবে। যেমন এরিক লিপার্ট মন্তব্যগুলিতে উল্লেখ করেছেন, যদিও পদ্ধতিটি সত্যই True
উপরোক্ত দুটি প্রশ্নের True
জন্য ফিরে আসবে, এটি এগুলির জন্যও ফিরে আসবে , যা আপনি সম্ভবত চান না:
void Main()
{
typeof(Base).IsAssignableFrom(typeof(Derived)).Dump();
typeof(Base).IsAssignableFrom(typeof(Base)).Dump();
typeof(int[]).IsAssignableFrom(typeof(uint[])).Dump();
}
public class Base { }
public class Derived : Base { }
এখানে আপনি নিম্নলিখিত আউটপুট পাবেন:
True
True
True
সেখানে সর্বশেষটি True
নির্দেশ করে যে, যদি পদ্ধতিটি কেবলমাত্র জিজ্ঞাসিত প্রশ্নের উত্তর দেয়, যা uint[]
উত্তরাধিকার সূত্রে প্রাপ্ত হয় int[]
বা তারা একই ধরণের হয়, যা স্পষ্টভাবে ঘটনাটি নয়।
সুতরাং IsAssignableFrom
পুরোপুরি সঠিক নয়।
is
এবং as
আপনার প্রশ্নের সাথে is
এবং as
প্রসঙ্গে "সমস্যা" হ'ল এগুলি আপনাকে অবজেক্টগুলিতে পরিচালনা করতে এবং কোনও কোডে সরাসরি কোডে লিখতে হবে এবং Type
অবজেক্টগুলির সাথে কাজ করবে না ।
অন্য কথায়, এটি সংকলন করবে না:
SubClass is BaseClass
^--+---^
|
+-- need object reference here
না এটি হবে:
typeof(SubClass) is typeof(BaseClass)
^-------+-------^
|
+-- need type name here, not Type object
না এটি হবে:
typeof(SubClass) is BaseClass
^------+-------^
|
+-- this returns a Type object, And "System.Type" does not
inherit from BaseClass
উপসংহার
উপরের পদ্ধতিগুলি আপনার প্রয়োজনের সাথে মাপসই হতে পারে তবে আপনার প্রশ্নের একমাত্র সঠিক উত্তর (যেমনটি আমি দেখছি) হ'ল আপনার অতিরিক্ত চেক লাগবে:
typeof(Derived).IsSubclassOf(typeof(Base)) || typeof(Derived) == typeof(Base);
অবশ্যই কোন পদ্ধতিতে আরও বোধগম্য হয়:
public bool IsSameOrSubclass(Type potentialBase, Type potentialDescendant)
{
return potentialDescendant.IsSubclassOf(potentialBase)
|| potentialDescendant == potentialBase;
}