【发布时间】:2012-08-02 14:24:55
【问题描述】:
动态创建Expression 树时如何创建演员表?
问题是,我有一个string 类型的属性:
public class Test
{
public string Id { get; set; }
}
我想一般地创建一个强类型的 lambda 表达式来表示一个委托,它返回一个 object 而不是 string (Expression<Func<T, object>>)。
现在我正在这样做:
private static Expression<Func<T, object>> CreateIdQuery()
{
Type type = typeof(T);
PropertyInfo idProperty = type.GetProperty("Id");
ParameterExpression lambdaParam = Expression.Parameter(type, "x");
MemberExpression body = Expression.Property(lambdaParam, idProperty);
LambdaExpression expr = Expression.Lambda(body, lambdaParam);
return (Expression<Func<T, object>>)expr;
}
但它在最后一行抛出异常(我不能将Expression<Func<Test, string>> 转换为Expression<Func<Test, object>>)。
我如何转换表达式的主体(我假设MemberExpression 部分需要转换为object)?
【问题讨论】:
-
创建 lambda 时,由于您知道类型是什么,因此使用 generic overloads 之一会更干净。尽管如果
Id是值类型,则仍然需要Convert表达式。
标签: c# reflection expression-trees