微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用Emit实现给实体赋值

代码

public static Action<T,object> EmitSetter<T>(string propertyName)
{
    var type = typeof(T);
    var dynamicmethod = new Dynamicmethod("EmitCall",1)">null,1)">new[] { type,1)">typeof(object) },type.Module);
    var iLGenerator = dynamicmethod.GetILGenerator();

    var callMethod = type.getmethod(set_" + propertyName,BindingFlags.Instance | BindingFlags.IgnoreCase | BindingFlags.Public);
    var parameterInfo = callMethod.GetParameters()[0];
    var local = iLGenerator.DeclareLocal(parameterInfo.ParameterType,1)">true);

    iLGenerator.Emit(OpCodes.Ldarg_1);
    if (parameterInfo.ParameterType.IsValueType)
    {
        iLGenerator.Emit(OpCodes.UnBox_Any,parameterInfo.ParameterType); // 如果是值类型,拆箱
    }
    else
    {
        iLGenerator.Emit(OpCodes.Castclass,1)"> 如果是引用类型,转换
    }

    iLGenerator.Emit(OpCodes.Stloc,local);
    iLGenerator.Emit(OpCodes.Ldarg_0);
    iLGenerator.Emit(OpCodes.Ldloc,local);

    iLGenerator.EmitCall(OpCodes.Callvirt,callMethod,null);
    iLGenerator.Emit(OpCodes.Ret);

    return dynamicmethod.CreateDelegate(typeof(Action<T,1)">object>)) as Action<T,1)">object>;
}
View Code

摘自博客:https://www.cnblogs.com/czly/archive/2018/06/01/9120280.html

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐