C#:在运行时获取类型参数以传递给通用方法[重复]

Posted

技术标签:

【中文标题】C#:在运行时获取类型参数以传递给通用方法[重复]【英文标题】:C# : Get type parameter at runtime to pass into a Generic method [duplicate] 【发布时间】:2012-03-12 11:18:05 【问题描述】:

泛型方法是...

    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) 具有无效参数”

这与我之前的问题有关:C# : Passing a Generic Object

我读到泛型类型无法在运行时确定,不使用反射或方法信息,但我不太清楚如何在这种情况下这样做。

谢谢你能告诉我=)

【问题讨论】:

【参考方案1】:

如果您真的想使用编译时未知的类型参数调用泛型方法,您可以编写如下代码:

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

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

【讨论】:

这是一个很好的例子,说明当你拥有的是运行时类型时如何调用泛型方法,但 OP 实际上并没有在他的例子中尝试这样做。 @Moo-Juice 的回答正确地解决了 OP 的问题。尽管如此,+1 因为当我需要这个“运行时类型作为通用参数”场景时,我已经多次遇到这个答案。 ;)【参考方案2】:

泛型提供编译时间参数多态性。您正在尝试将它们与仅在 Runtime 指定的类型一起使用。 简短的回答:它不会起作用,也没有理由这样做(除了反射,但那是完全不同的野兽)。

【讨论】:

【参考方案3】:

只要打电话:

PrintGeneric2(test2);

编译器会根据你传递的信息推断出&lt;t&gt;

【讨论】:

您的建议将强制编译器将 T 推断为 System.Type。我认为这不会正确反映传递运行时评估类型的 OP 意图 @AZ,不,不会。完全忽略Type t = test2.GetType() 部分,这里不需要。 test2 实现 ITest(请参阅他的上一个问题)。按原样传递test2 就足够了。 很公平。没有检查其他问题,所以我缺乏 test2 的上下文。我仍然坚持我的假设,即 OP 希望以某种方式在运行时动态解析 T,而这不是泛型的用途 @AZ,我认为他认为他需要动态解决它,而实际上他不需要。 :)

以上是关于C#:在运行时获取类型参数以传递给通用方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章

通用传递类型列表以用于通用方法[重复]

将 SQL 参数集合传递给函数

c#中泛型类型的默认值[重复]

传递方法作为参数[重复]

在c#中遍历通用类型列表

将属性本身传递给 C# 中的参数