【发布时间】:2011-12-09 17:05:49
【问题描述】:
这最好用代码来解释。我有一个泛型类,它有一个返回整数的方法。这是一个简单的版本,用于解释......
public class Gen<T>
{
public int DoSomething(T instance)
{
// Real code does something more interesting!
return 1;
}
}
在运行时,我使用反射来发现某物的类型,然后想为该特定类型创建我的 Gen 类的实例。这很容易,并且像这样完成......
Type fieldType = // This is the type I have discovered
Type genericType = typeof(Gen<>).MakeGenericType(fieldType);
object genericInstance = Activator.CreateInstance(genericType);
我现在想创建一个表达式,它将泛型类型的实例作为参数,然后调用该类型的 DoSomething 方法。所以我希望表达式能够有效地执行此操作...
int answer = genericInstance.DoSomething(instance);
...除了我在运行时的某个时间点之前没有“实例”,而 genericInstance 是生成的类型,如上所示。我为此创建 Lambda 的尝试如下...
MethodInfo mi = genericType.GetMethod("DoSomething",
BindingFlags.Instance | BindingFlags.Public);
var p1 = Expression.Parameter(genericType, "generic");
var p2 = Expression.Parameter(fieldType, "instance");
var x = Expression.Lambda<Func<genericType, fieldType, int>>
(Expression.Call(p1, mi, p2),
new[] { p1, p2 }).Compile();
...以便以后我可以用类似这样的方式调用它...
int answer = x(genericInstance, instance);
当然,你不能为 Func 提供实例参数,所以我不知道如何参数化 Lambda 生成。有什么想法吗?
【问题讨论】:
标签: c# generics lambda expression-trees