Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用表达式获取属性值,而不知道编译时的目标类型_C#_Linq_Expression - Fatal编程技术网

C# 使用表达式获取属性值,而不知道编译时的目标类型

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

我试图创建一个表达式lambda来传递一个对象,然后获取命名属性return的值。但是,该类型仅在运行时已知

我从以下方法开始处理编译时已知的类型:

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);