Используя отражение, я пытаюсь найти набор типов, которые наследуются от данного базового класса. Это не заняло много времени, чтобы понять простые типы, но я озадачен, когда дело доходит до дженериков.
Для этого фрагмента кода первый IsAssignableFrom возвращает значение true, а второй возвращает значение false. И все же, окончательное задание компилируется просто отлично.
class class1 { }
class class2 : class1 { }
class generic1<T> { }
class generic2<T> : generic1<T> { }
class Program
{
static void Main(string[] args)
{
Type c1 = typeof(class1);
Type c2 = typeof(class2);
Console.WriteLine("c1.IsAssignableFrom(c2): {0}", c1.IsAssignableFrom(c2));
Type g1 = typeof(generic1<>);
Type g2 = typeof(generic2<>);
Console.WriteLine("g1.IsAssignableFrom(g2): {0}", g1.IsAssignableFrom(g2));
generic1<class1> cc = new generic2<class1>();
}
}
Так как же определить во время выполнения, является ли одно определение универсального типа производным от другого?
У меня есть другой подход, который решает этот вопрос, Вот мои классы
public class Signal<T>{
protected string Id {get; set;} //This must be here, I use a property because MemberInfo is returned in an array via GetMember() reflection function
//Some Data and Logic And stuff that involves T
}
public class OnClick : Signal<string>{}
Теперь, если у меня есть экземпляр типа OnClick, но я не знаю, что, и хочу узнать, есть ли у меня экземпляр чего-нибудь, что наследовалось Signal<> какого-либо типа? Я делаю это
Type type = GetTypeWhomISuspectMightBeAGenericSignal();
PropertyInfo secretProperty = type.GetProperty("Id", BindingFlags.NonPublic | BindingFlags.Instance);
Type SpecificGenericType = secretProperty.DeclaringType; //This is the trick
bool IsMyTypeInheriting = SpecificGenericType.IsGenericType && SpecificGenericType.GetGenericTypeDefinition() == typeof(Signal<>); //This way we are getting the genericTypeDefinition and comparing it to any other genericTypeDefinition of the same argument length.
, Таким образом, это работает на меня, не рекурсивный, и это использует прием через обозначенное свойство. Это имеет ограничения, что ее твердое для записи функции, которая проверяет присваиваемость на все дженерики когда-либо. Но для определенного типа это работает
, Очевидно, необходимо проверить, если () условия лучше и материал, но это Необработанные строки, требуемые оценить присваиваемость типа к его основному дженерику, этому пути.
Hope это помогает