Rõ ràng là không.
Đây là các tùy chọn:
Loại.IsSubgroupOf
Như bạn đã phát hiện ra, điều này sẽ không hoạt động nếu hai loại giống nhau, đây là một chương trình LINQPad mẫu minh họa:
void Main()
{
typeof(Derived).IsSubclassOf(typeof(Base)).Dump();
typeof(Base).IsSubclassOf(typeof(Base)).Dump();
}
public class Base { }
public class Derived : Base { }
Đầu ra:
True
False
Điều đó chỉ ra rằng đó Derived
là một lớp con của Base
, nhưng đó Base
(rõ ràng) không phải là một lớp con của chính nó.
Loại.IsAssignableFrom
Bây giờ, điều này sẽ trả lời câu hỏi cụ thể của bạn, nhưng nó cũng sẽ cung cấp cho bạn dương tính giả. Như Eric Lippert đã chỉ ra trong các bình luận, trong khi phương thức thực sự sẽ trả về True
hai câu hỏi trên, nó cũng sẽ trả về True
những điều này, điều mà bạn có thể không muốn:
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 { }
Ở đây bạn nhận được đầu ra sau:
True
True
True
Cuối cùng True
ở đó sẽ chỉ ra, nếu phương thức chỉ trả lời câu hỏi được hỏi, đó là uint[]
kế thừa từ int[]
hoặc chúng cùng loại, rõ ràng không phải là trường hợp.
Vì vậy, IsAssignableFrom
cũng không hoàn toàn chính xác.
is
và as
"Vấn đề" với is
và as
trong bối cảnh câu hỏi của bạn là họ sẽ yêu cầu bạn thao tác trên các đối tượng và viết một trong các loại trực tiếp trong mã, và không hoạt động với Type
các đối tượng.
Nói cách khác, điều này sẽ không được biên dịch:
SubClass is BaseClass
^--+---^
|
+-- need object reference here
cũng không phải điều này:
typeof(SubClass) is typeof(BaseClass)
^-------+-------^
|
+-- need type name here, not Type object
cũng không phải điều này:
typeof(SubClass) is BaseClass
^------+-------^
|
+-- this returns a Type object, And "System.Type" does not
inherit from BaseClass
Phần kết luận
Mặc dù các phương pháp trên có thể phù hợp với nhu cầu của bạn, nhưng câu trả lời đúng duy nhất cho câu hỏi của bạn (như tôi thấy) là bạn sẽ cần kiểm tra thêm:
typeof(Derived).IsSubclassOf(typeof(Base)) || typeof(Derived) == typeof(Base);
điều này tất nhiên có ý nghĩa hơn trong một phương thức:
public bool IsSameOrSubclass(Type potentialBase, Type potentialDescendant)
{
return potentialDescendant.IsSubclassOf(potentialBase)
|| potentialDescendant == potentialBase;
}