Expression父类给子类动态赋值

private static Func<object, object> CreateConverter<TBase,TSub>() where TSub : TBase, new()
{
    var baseType = typeof(TBase);
    var subType = typeof(TSub);

    var baseParam = Expression.Parameter(type: typeof(object),name: "baseObj");
    var base0bject = Expression.Convert(expression: baseParam, type: baseType);

    var subVar = Expression.Variable(type: subType, name: "subObj");
    var assignSubVar = Expression.Assign(left: subVar, right: Expression.New(type: subType));

    var baseProperties = baseType.GetProperties(bindingAttr: BindingFlags.Public | 
 BindingFlags.Instance).Where(predicate: p => p.CanRead && p.CanWrite)ToArray();

    var propertyAssignments = baseProperties.Select(selector: property => 
        Expression.Assign(
          left: Expression.Property(expression: subVar, propertyName: property.Name),
          right: Expression.Property(expression: base0bject, propertyName: property.Name)
        )
    );
    var block = Expression.Block(
        variables: new[] { subVar }, 
        expressions:  assignSubVar,
        Expression.Block(expressions: propertyAssignments),
        Expression.Convert(expression: subVar,type: typeof(object))
    );
    var lambda = Expression.Lambda<Func<object, object>>(body: block, parameters: baseParam);
    return lambda.Compile();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王柏龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值