System.Reflection.Emit将代码添加到propertyInfo

时间:2017-09-28 19:08:11

标签: c# asp.net system.reflection

我是System.Reflection.Emit的新手,并试图从我的库中删除nuget PropertChanged.Fody并构建类似的东西。 所以这就是我得到的。 这个方法被称为UpdateProperty bu什么是真正剂量覆盖PropertyInfo所以如果我的PropertyInfo不是虚拟的,这个代码将不起作用。 那么是否可以在不创建新属性的情况下更新我的PropertyInfo集?

    private static void UpdateProperty(PropertyInfo propertyInfo, TypeBuilder typeBuilder, 
                                       MethodInfo raisePropertyChangedMethod)
    {
        // Update the setter of the class, here is the problem im creating new PropertyInfo
        PropertyBuilder propertyBuilder = typeBuilder.DefineProperty(propertyInfo.Name,
        PropertyAttributes.None, propertyInfo.PropertyType, null);

        // Create set method
        MethodBuilder builder = typeBuilder.DefineMethod("set_" + propertyInfo.Name, MethodAttributes.Public | MethodAttributes.Virtual , null, new Type[] { propertyInfo.PropertyType });
        builder.DefineParameter(1, ParameterAttributes.None, "value");
        ILGenerator generator = builder.GetILGenerator();

        // Add IL code for set method
        generator.Emit(OpCodes.Nop);
        generator.Emit(OpCodes.Ldarg_0);
        generator.Emit(OpCodes.Ldarg_1);
        generator.Emit(OpCodes.Call, propertyInfo.GetSetMethod());

        // Call property changed for object
        generator.Emit(OpCodes.Nop);
        generator.Emit(OpCodes.Ldarg_0);
        generator.Emit(OpCodes.Ldstr, propertyInfo.Name);
        generator.Emit(OpCodes.Callvirt, raisePropertyChangedMethod);
        generator.Emit(OpCodes.Nop);
        generator.Emit(OpCodes.Ret);
        propertyBuilder.SetSetMethod(builder);
    }

1 个答案:

答案 0 :(得分:0)

AFAIK没有在运行时替换方法体(或属性设置器)的官方方法(除非它是动态方法)。不过,有很多方法可以做到这一点。参见

但是,当属性值更改时,可以在编译时注入引发PropertyChanged方法的代码(这是 PropertyChanged.Fody 所做的),并且在我看来它是优于运行时代码修改的解决方案。< / p>