Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.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# 使用表达式获取属性的get Acessor_C#_Api_Reflection_Lambda_Expression - Fatal编程技术网

C# 使用表达式获取属性的get Acessor

C# 使用表达式获取属性的get Acessor,c#,api,reflection,lambda,expression,C#,Api,Reflection,Lambda,Expression,我想获取属性的get Acessor(PropertyInfo)并将其编译为Func。声明类型仅在运行时已知 我目前的代码是: public Func<Object, Object> CompilePropGetter(PropertyInfo info) { MethodInfo getter = info.GetGetMethod(); ParameterExpression instance = Expression.Parameter(info.Declar

我想获取属性的get Acessor(
PropertyInfo
)并将其编译为
Func
。声明类型仅在运行时已知

我目前的代码是:

public Func<Object, Object> CompilePropGetter(PropertyInfo info)
{
    MethodInfo getter = info.GetGetMethod();

    ParameterExpression instance = Expression.Parameter(info.DeclaringType, info.DeclaringType.Name);

    MethodCallExpression setterCall = Expression.Call(instance, getter);

    Expression getvalueExp = Expression.Lambda(setterCall, instance);


    Expression<Func<object, object>> GetPropertyValue = (Expression<Func<object, object>>)getvalueExp;
    return GetPropertyValue.Compile();

}

那么,如何返回
Func

您可以使用
表达式向预期类型和返回类型添加强制转换。Convert

public static Func<Object, Object> CompilePropGetter(PropertyInfo info)
{
    ParameterExpression instance = Expression.Parameter(typeof(object));
    var propExpr = Expression.Property(Expression.Convert(instance, info.DeclaringType), info);
    var castExpr = Expression.Convert(propExpr, typeof(object));
    var body = Expression.Lambda<Func<object, object>>(castExpr, instance);
    return body.Compile();
}
publicstaticfunc编译器复制程序(PropertyInfo-info)
{
ParameterExpression实例=Expression.Parameter(typeof(object));
var propExpr=Expression.Property(Expression.Convert(instance,info.DeclaringType),info);
var castExpr=Expression.Convert(propExpr,typeof(object));
var body=Expression.Lambda(castExpr,instance);
返回body.Compile();
}

您可以使用
表达式将强制转换添加到预期类型和返回类型。Convert

public static Func<Object, Object> CompilePropGetter(PropertyInfo info)
{
    ParameterExpression instance = Expression.Parameter(typeof(object));
    var propExpr = Expression.Property(Expression.Convert(instance, info.DeclaringType), info);
    var castExpr = Expression.Convert(propExpr, typeof(object));
    var body = Expression.Lambda<Func<object, object>>(castExpr, instance);
    return body.Compile();
}
publicstaticfunc编译器复制程序(PropertyInfo-info)
{
ParameterExpression实例=Expression.Parameter(typeof(object));
var propExpr=Expression.Property(Expression.Convert(instance,info.DeclaringType),info);
var castExpr=Expression.Convert(propExpr,typeof(object));
var body=Expression.Lambda(castExpr,instance);
返回body.Compile();
}