C# 使用表达式获取属性值,而不知道编译时的目标类型
我试图创建一个表达式lambda来传递一个对象,然后获取命名属性return的值。但是,该类型仅在运行时已知 我从以下方法开始处理编译时已知的类型:C# 使用表达式获取属性值,而不知道编译时的目标类型,c#,linq,expression,C#,Linq,Expression,我试图创建一个表达式lambda来传递一个对象,然后获取命名属性return的值。但是,该类型仅在运行时已知 我从以下方法开始处理编译时已知的类型: private static Func<T, object> CreateExpression(string propertyName) { var arg = Expression.Parameter(typeof(T)); var expr = Expression.Property(arg, propertyNam
private static Func<T, object> CreateExpression(string propertyName)
{
var arg = Expression.Parameter(typeof(T));
var expr = Expression.Property(arg, propertyName);
return Expression.Lambda<Func<T, object>>(expr, arg).Compile();
}
内部Convert
将输入参数转换为对象,外部Convert
转换返回值。是:
var arg = Expression.Parameter(typeof(object));
var expr = Expression.Property(Expression.Convert(arg, type), propertyName);
注意:返回类型(
对象
)意味着许多类型需要装箱。既然您提到您这样做是为了过滤:如果可能的话,请尝试通过创建一个Func
来避免此框,该函数在内部执行任何比较等操作,而无需装箱。有一个非通用版本的Expression.Lambda
,您可能需要查看that@Rhumborl那将收获甚微;您需要一个Func
来实现性能;带有DynamicInvoke
的委托
非常慢。我考虑过这一点,但我只能使用DynamicInvoke调用委托,这相当慢:-(这很完美!:)如何添加表达式Equal和另一个要比较的参数?我在猜测一个Func(obj,value,result)?@好吧,那么你每次都会装箱输入,所以可能没有收益;我在想更多的Expression.Equal(…,Expression.Constant(expectedValue))
在玩了一点这个之后,我仍然得到一个关于返回类型的异常,就像你在笔记中提到的那样。显然,它并不介意返回字符串和URI,但TimeSpan、Int32和Double抛出ArgumentException,因此正文肯定需要装箱。:/主体部分如下:var Body=Expression.Convert(Expression.Property(Expression.Convert(arg,type),name),typeof(object);
@nauty我以为它会自动装箱,但看起来不是:(
Func<object,object> CreateDelegate(string propertyName, Type targetType)
{
var arg = Expression.Parameter(type);
var body = Expression.Property(arg, name);
var lambda = Expression.Lambda<Func<object,object>>(body, arg); //ArgumentException
return lambda.Compile();
}
var body = Expression.Convert(
Expression.Property(
Expression.Convert(arg, type),
name),
typeof(object));
var arg = Expression.Parameter(typeof(object));
var expr = Expression.Property(Expression.Convert(arg, type), propertyName);