Подтвердить что ты не робот

С#: Получить параметр типа во время выполнения, чтобы перейти в общий метод

Общий метод...

    public void PrintGeneric2<T>(T test) where T : ITest
    {
        Console.WriteLine("Generic : " + test.myvar);
    }

Я вызываю это из Main()...

    Type t = test2.GetType();       
    PrintGeneric2<t>(test2);

Я получаю ошибку "CS0246: имя типа или пространства имен" t "не может быть найдено" и "CS1502: лучший перегруженный метод соответствует DoSomethingClass.PrintGeneric2 <t> (T) имеет недопустимые аргументы"

Это связано с моим предыдущим вопросом здесь: С#: Передача универсального объекта

Я читал, что общий тип не может быть определен во время выполнения, без использования рефлексии или методаinfo, но я не совсем понимаю, как это сделать в этом случае.

Спасибо, если вы можете просветить меня =)

4b9b3361

Ответ 1

Если вы действительно хотите вызвать общий метод, используя параметр типа, неизвестный во время компиляции, вы можете написать что-то вроде:

typeof(YourType).GetMethod("PrintGeneric2").MakeGenericMethod(t).Invoke(instance, new object[] { test2 } );

Однако, как указано в других ответах, Generics может быть не лучшим решением в вашем случае.

Ответ 2

Generics предлагает параметрический полиморфизм Компиляция времени. Вы пытаетесь использовать их с типом, указанным только в Runtime.  Короткий ответ: он не сработает, и у него нет причин (кроме отражения, но это совсем другой зверь).

Ответ 3

Просто позвоните:

PrintGeneric2(test2);

Компилятор выведет <t> из того, что вы передаете.