代码:

public static Action<T, object> EmitSetter<T>(string propertyName)
{
    var type = typeof(T);
    var dynamicMethod = new DynamicMethod("EmitCall", null, new[] { type, 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, true);

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

    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, object>)) as Action<T, object>;
}
View Code

相关文章:

  • 2022-01-19
  • 2022-12-23
  • 2022-12-23
  • 2021-07-15
  • 2021-11-08
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-08-23
  • 2021-10-07
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案