Лучший способ проверить, является ли System.Type потомком данного класса
-
07-07-2019 - |
Вопрос
Рассмотрим следующий код:
public class A
{
}
public class B : A
{
}
public class C : B
{
}
class D
{
public static bool IsDescendantOf(this System.Type thisType, System.Type thatType)
{
/// ???
}
void Main()
{
A cValue = new C();
C.GetType().IsDescendantOf(cValue.GetType());
}
}
Каков наилучший способ реализации IsDescendantOf?
Решение
Type.IsSubclassOf () Определяет, является ли класс, представленный текущим типом, происходит от класса, представленного указанным типом.
Другие советы
Вы, вероятно, ищете Type.IsAssignableFrom . р>
Я понимаю, что это не дает прямого ответа на ваш вопрос, но вы можете подумать об использовании этого вместо метода в вашем примере:
public static bool IsDescendantOf<T>(this object o)
{
if(o == null) throw new ArgumentNullException();
return typeof(T).IsSubclassOf(o.GetType());
}
Так что вы можете использовать это так:
C c = new C();
c.IsDescendantOf<A>();
Кроме того, чтобы ответить на ваш вопрос о разнице между Type.IsSubclassOf и Type.IsAssignableFrom - IsAssignableFrom слабее в том смысле, что если у вас есть два объекта a и b, такие, что это действительно:
a = b;
Тогда typeof (A) .IsAssignableFrom (b.GetType ())
имеет значение true, поэтому a может быть подклассом b или типом интерфейса.
Напротив, a.GetType (). IsSubclassOf (typeof (B))
вернул бы true, только если a был подклассом b. Учитывая имя вашего метода расширения, я бы сказал, что вы должны использовать IsSubclassOf вместо IsAssignable для;
Я думаю, вы ищете это Тип.IsSubclassOf()
Редактировать:
Я не знаю ваших требований, но, возможно, это лучший способ:
bool isDescendant = cValue is C;