опоздал к игре на этом ... у меня тоже есть еще одна перестановка ответа JarodPar.
здесь Type.IsSubClassOf (Type) любезно предоставлено отражателем:
public virtual bool IsSubclassOf(Type c)
{
Type baseType = this;
if (!(baseType == c))
{
while (baseType != null)
{
if (baseType == c)
{
return true;
}
baseType = baseType.BaseType;
}
return false;
}
return false;
}
Исходя из этого, мы видим, что он не делает ничего слишком умного и похож на итеративный подход JaredPar. Все идет нормально. вот моя версия (отказ от ответственности: не полностью проверен, поэтому позвольте мне знать, если вы обнаружите проблемы)
public static bool IsExtension(this Type thisType, Type potentialSuperType)
{
//
// protect ya neck
//
if (thisType == null || potentialSuperType == null || thisType == potentialSuperType) return false;
//
// don't need to traverse inheritance for interface extension, so check/do these first
//
if (potentialSuperType.IsInterface)
{
foreach (var interfaceType in thisType.GetInterfaces())
{
var tempType = interfaceType.IsGenericType ? interfaceType.GetGenericTypeDefinition() : interfaceType;
if (tempType == potentialSuperType)
{
return true;
}
}
}
//
// do the concrete type checks, iterating up the inheritance chain, as in orignal
//
while (thisType != null && thisType != typeof(object))
{
var cur = thisType.IsGenericType ? thisType.GetGenericTypeDefinition() : thisType;
if (potentialSuperType == cur)
{
return true;
}
thisType = thisType.BaseType;
}
return false;
}
в основном это просто метод расширения для System.Type - я сделал это, чтобы преднамеренно ограничить тип "thisType" конкретными типами, так как я сразу же использую запрос LINQ "где" для предикатов объектов Type. я уверен, что все вы, умные люди, могли бы столкнуть его с эффективным, универсальным статическим методом, если вам нужно :) код делает несколько вещей, код ответа которых не делает
- открыть это до общего "расширения" - я рассматриваю наследование (думаю, классы)
а также реализация (интерфейсы); имена методов и параметров
изменены, чтобы лучше отражать это
- Ввод нулевой проверки (МЭА)
- ввод того же типа (класс не может расширяться сам)
- выполнение короткого замыкания, если рассматриваемый тип является интерфейсом; поскольку GetInterfaces () возвращает все реализованные интерфейсы (даже реализованные в суперклассах), вы можете просто перебрать эту коллекцию, не поднимаясь по дереву наследования
остальное в основном совпадает с кодом JaredPar