使用类型变量调用泛型方法[重复]

Posted

技术标签:

【中文标题】使用类型变量调用泛型方法[重复]【英文标题】:Calling generic method with Type variable [duplicate] 【发布时间】:2010-10-18 09:19:05 【问题描述】:

我有一个通用方法

Foo<T>

我有一个类型变量bar

是否有可能实现类似Foo&lt;bar&gt;

Visual Studio 在栏上需要一个类型或命名空间。

【问题讨论】:

你能在你尝试使用它的地方显示一些代码吗?这绝对有可能,所以很可能是语法错误。 【参考方案1】:

让我们假设 Foo 在类 Test 中声明,例如

public class Test

   public void Foo<T>()  ... 


您需要首先使用MakeGenericMethod 实例化类型bar 的方法。然后使用反射调用它。

var mi = typeof(Test).GetMethod("Foo");
var fooRef = mi.MakeGenericMethod(bar);
fooRef.Invoke(new Test(), null);

【讨论】:

非常感谢...正是我所需要的!【参考方案2】:

如果我正确理解了您的问题,那么您实质上定义了以下类型:

public class Qaz

    public void Foo<T>(T item)
    
        Console.WriteLine(typeof(T).Name);
    


public class Bar  

现在,假设您有一个变量bar 定义如下:

var bar = typeof(Bar);

然后您希望能够调用Foo&lt;T&gt;,将T 替换为您的实例变量bar

方法如下:

// Get the generic method `Foo`
var fooMethod = typeof(Qaz).GetMethod("Foo");

// Make the non-generic method via the `MakeGenericMethod` reflection call.
// Yes - this is confusing Microsoft!!
var fooOfBarMethod = fooMethod.MakeGenericMethod(new[]  bar );

// Invoke the method just like a normal method.
fooOfBarMethod.Invoke(new Qaz(), new object[]  new Bar() );

享受吧!

【讨论】:

+1 ... 比接受的答案稍晚一点,但非常棒! @Daniel Elliot - 是的,我知道 - 41 秒后。我希望我稍微更详细的答案会占上风,但是唉。 ;-) 我的代码可以工作了,详细的最佳答案....谢谢

以上是关于使用类型变量调用泛型方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用仅在执行时已知的类型参数调用泛型方法[重复]

java泛型类型变量能调用的方法

java泛型总结

表达式树练习实践:C#值类型引用类型泛型集合调用函数

JAVA泛型_泛型类接口通配符方法上下边界

Java-泛型摘抄