Использование IsAssignableFrom с «открытыми» универсальными типами

Используя отражение, я пытаюсь найти набор типов, которые наследуются от данного базового класса. Это не заняло много времени, чтобы понять простые типы, но я озадачен, когда дело доходит до дженериков.

Для этого фрагмента кода первый 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>();
    }
}

Так как же определить во время выполнения, является ли одно определение универсального типа производным от другого?

57
задан 22 September 2016 в 01:29

1 ответ

У меня есть другой подход, который решает этот вопрос, Вот мои классы

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 это помогает

0
ответ дан 1 November 2019 в 16:44

Другие вопросы по тегам:

Похожие вопросы: