【发布时间】:2010-10-18 09:19:05
【问题描述】:
我有一个通用方法
Foo<T>
我有一个类型变量bar
是否有可能实现类似Foo<bar>
Visual Studio 在栏上需要一个类型或命名空间。
【问题讨论】:
-
你能在你尝试使用它的地方显示一些代码吗?这绝对有可能,所以很可能是语法错误。
我有一个通用方法
Foo<T>
我有一个类型变量bar
是否有可能实现类似Foo<bar>
Visual Studio 在栏上需要一个类型或命名空间。
【问题讨论】:
让我们假设 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);
【讨论】:
如果我正确理解了您的问题,那么您实质上定义了以下类型:
public class Qaz
{
public void Foo<T>(T item)
{
Console.WriteLine(typeof(T).Name);
}
}
public class Bar { }
现在,假设您有一个变量bar 定义如下:
var bar = typeof(Bar);
然后您希望能够调用Foo<T>,将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() });
享受吧!
【讨论】:
Daniel Elliot - 是的,我知道 - 41 秒后。我希望我稍微更详细的答案会占上风,但是唉。 ;-)