C#:在运行时获取类型参数以传递给Generic方法

use*_*895 17 c# generics types

通用方法是......

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

我是从Main()调用它的...

    Type t = test2.GetType();       
    PrintGeneric2<t>(test2);
Run Code Online (Sandbox Code Playgroud)

我得到错误"CS0246:类型或命名空间名称'T’无法找到"和"CS1502:最好重载的方法匹配DoSomethingClass.PrintGeneric2 <T>(T)具有无效参数"

这与我之前的问题有关:C#:传递通用对象

我已经读过,在没有使用反射或methodinfo的情况下,无法在运行时确定泛型类型,但是在这个实例中我不太清楚如何这样做.

谢谢,如果你能启发我=)

Mat*_*ias 29

如果你真的想使用编译时未知的类型参数来调用泛型方法,你可以编写如下内容:

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

但是,正如其他回复所述,泛型可能不是您的最佳解决方案.


Adr*_*scu 7

泛型提供编译时参数多态性.您正尝试使用仅在运行时指定的类型.简短回答:它不起作用,没有理由(除了反思,但完全是一个不同的野兽).


Moo*_*ice 2

只需致电:

PrintGeneric2(test2);
Run Code Online (Sandbox Code Playgroud)

编译器会<t>根据您传递的内容进行推断。

  • @AZ,我认为他*认为*他需要动态地解决它,而事实上,他不需要。:) (2认同)