【问题标题】:C# : Get type parameter at runtime to pass into a Generic method [duplicate]C#:在运行时获取类型参数以传递给通用方法[重复]
【发布时间】: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

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

谢谢你能告诉我=)

【问题讨论】:

    标签: c# generics types


    【解决方案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,我认为他认为他需要动态解决它,而实际上他不需要。 :)
      猜你喜欢
      • 1970-01-01
      • 2013-08-13
      • 2012-12-10
      • 2010-10-19
      • 2014-10-04
      • 1970-01-01
      • 2019-12-24
      • 2013-11-12
      • 1970-01-01
      相关资源
      最近更新 更多