【发布时间】:2012-11-16 09:49:55
【问题描述】:
我正在做的事情有点麻烦。我最初创建了一个通用层,它位于我的业务对象和工作正常的数据访问层之间。然后,我最近读到了一种名为 Expression Trees 的东西,它显然更有效,并且已被证明是如此,因为我用表达式交换了 Activator.CreateInstance() 并以指数方式改进了我的通用层。
我仍在阅读有关整个区域(表达式)的一些内容,但我遇到了一些我想尝试使其通用的代码。目前,您必须传入一个具体的类型,例如字符串、整数、十进制等。我是这个位是通用的。我尝试了几件事但失败了。我想要通用的位是Action,我不想传入一个字符串,我希望能够通用地传入属性的类型,即 typeof(T).GetProperty("Forename").PropertyType 。这可能吗?正在考虑做一个有点 foo bar 的 switch 语句。
提前致谢,奥南。
public class TTT<T> where T : new()
{
public void Do(object t)
{
MethodInfo info = typeof(T).GetProperty("Forename").GetSetMethod();
ParameterExpression param = Expression.Parameter(typeof(string), "val");
MethodCallExpression call = Expression.Call(Expression.Constant(t), info,
new ParameterExpression[] { param });
Action<string> action = Expression.Lambda<Action<string>>(call, param).Compile();
action("hi");
}
}
【问题讨论】:
标签: c# generics reflection expression-trees