65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2010年8月16日

CPOL
viewsIcon

12889

如果目的是从数据填充对象,为什么不使用一个专门执行此操作的表达式呢?

free hit counters

在之前的文章中,我展示了如何通过创建实例并在这些实例中设置属性来填充对象。

但是,如果目的是从数据填充对象,为什么不使用一个专门执行此操作的表达式呢? 这就是成员初始化表达式的用途。

要创建这样的表达式,我们需要构造函数表达式和属性绑定表达式

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

© . All rights reserved.