【问题标题】:System.Reflection.Emit adding code to propertyInfoSystem.Reflection.Emit 将代码添加到 propertyInfo
【发布时间】:2017-09-28 19:08:11
【问题描述】:

我是 System.Reflection.Emit 的新手,并试图从我的库中删除 nuget PropertChanged.Fody 并构建类似的东西。 所以这就是我得到的。 此方法称为 UpdateProperty 但真正的剂量是覆盖 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);
    }

【问题讨论】:

    标签: c# asp.net system.reflection


    【解决方案1】:

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

    但是,当属性值更改时,注入引发 PropertyChanged 方法的代码可以在编译时完成(这是 PropertyChanged.Fody 所做的),在我看来,它是比运行时代码修改更可取的解决方案。

    【讨论】:

    • 好吧,我明白你的意思,但是 propertyInfo 中的设置器是密封的,我认为这些链接可以工作。我想要这样的东西 var user =Get() 现在用户已经实现了这些更改,而无需在新组件中创建新类型等等。 rihjt 现在我在看 Mono.Cecil 和它的好,但它不支持 .net core 2,这很疯狂
    猜你喜欢
    • 2013-05-24
    • 1970-01-01
    • 2015-08-25
    • 2010-09-12
    • 2014-04-20
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    相关资源
    最近更新 更多