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);
编译器会根据你传递的信息推断出<t>
。
【讨论】:
您的建议将强制编译器将 T 推断为 System.Type。我认为这不会正确反映传递运行时评估类型的 OP 意图 @AZ,不,不会。完全忽略Type t = test2.GetType()
部分,这里不需要。 test2
实现 ITest
(请参阅他的上一个问题)。按原样传递test2
就足够了。
很公平。没有检查其他问题,所以我缺乏 test2 的上下文。我仍然坚持我的假设,即 OP 希望以某种方式在运行时动态解析 T,而这不是泛型的用途
@AZ,我认为他认为他需要动态解决它,而实际上他不需要。 :)以上是关于C#:在运行时获取类型参数以传递给通用方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章