2010-10-18 49 views
26

我有一个通用的方法调用带有类型变量的泛型方法

Foo<T> 

我有一个类型变量bar

是否有可能实现的东西像Foo<bar>

Visual Studio是期望的类型或在酒吧的名字空间。

善良,

+0

你可以在你试图使用它的地方显示一些代码吗?这是可能的,所以它可能是一个语法错误。 – RPM1984 2010-10-18 09:21:01

回答

34

使这种类型让我们假设foo是在课堂测试中声明,如

public class Test 
{ 
    public void Foo<T>() { ... } 

} 

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

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

感谢亲切......只是我需要! – 2010-10-18 09:58:18

3

您可以通过

typeof(Foo<>).MakeGenericType(bar); 
20

如果我正确理解你的问题,你已经在本质上,以下类型定义:

public class Qaz 
{ 
    public void Foo<T>(T item) 
    { 
     Console.WriteLine(typeof(T).Name); 
    } 
} 

public class Bar { } 

现在,给你有一个变量bar定义为这样:

var bar = typeof(Bar); 

然后,您希望能够拨打Foo<T>,用您的实例变量bar替换T

方法如下:

// 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() }); 

享受!

+0

+1 ...比接受的答案晚一点,但是非常棒! – 2010-10-18 09:59:51

+3

@ Daniel Elliot' - 是的,我知道 - 41秒后。我希望我稍微更详细的答案会占上风,但唉。 ;-) – Enigmativity 2010-10-18 10:13:23

+0

我的代码得到工作,详细的最佳答案....谢谢 – 2016-02-16 10:45:55