Expression.Lambda getter函数编译

问题描述 投票:0回答:1

code:

static Func<T,object> CompileGetValueExpression<T>(PropertyInfo propertyInfo)
{
    var instance = Expression.Parameter(propertyInfo.DeclaringType, "i");
    var property = Expression.Property(instance, propertyInfo);
    var convert = Expression.TypeAs(property, typeof(object));
    return Expression.Lambda<Func<T,object>>(convert, instance).Compile();
}

e.g

void Main()
{
    var data = new Test{prop1 = 1};
    var type = data.GetType();
    var prop = type.GetProperties().First();
    var function = CompileGetValueExpression<Test>(prop);
    var result = function(data); //result:1
}

class Test{
    public int prop1 { get; set; }
}

question

这个表达式函数是否完全等于下面的方法?

object GetterFunction(Test i) => i.prop1 as object; 
c#
1个回答
1
投票

我认为他们是。一个证据是,如果将CompileGetValueExpression中创建的表达式转储为字符串,则输出i => (i.prop1 As Object)

尝试修改CompileGetValueExpression的最后一行

Expression.Lambda<Func<T, object>>(convert, instance).ToString();
© www.soinside.com 2019 - 2024. All rights reserved.