使用表达式树填充对象 - 第 II 部分





5.00/5 (1投票)
如果目的是从数据填充对象,为什么不使用一个专门执行此操作的表达式呢?
在之前的文章中,我展示了如何通过创建实例并在这些实例中设置属性来填充对象。
但是,如果目的是从数据填充对象,为什么不使用一个专门执行此操作的表达式呢? 这就是成员初始化表达式的用途。
要创建这样的表达式,我们需要构造函数表达式和属性绑定表达式
var properties = objectType.GetProperties();
var bindings = new MemberBinding[properties.Length];
var valuesArrayExpression = Expression.Parameter(typeof(object[]), "v");
for (int p = 0; p < properties.Length; p++)
{
var property = properties[p];
bindings[p] = Expression.Bind(
property,
Expression.Convert(
Expression.ArrayAccess(
valuesArrayExpression,
Expression.Constant(p, typeof(int))
),
property.PropertyType
)
);
}
var memberInitExpression = Expression.MemberInit(
Expression.New(objectType),
bindings
);
var objectHidrationExpression = Expression.Lambda<Func<object[],
object>>(memberInitExpression, valuesArrayExpression);
var compiledObjectHidrationExpression = objectHidrationExpression.Compile();
这可能看起来比之前的解决方案更复杂,但使用起来却简单得多
for (int o = 0; o < objects.Length; o++)
{
newObjects[o] = compiledObjectHidrationBLOCKED EXPRESSION;
}