代码之家  ›  专栏  ›  技术社区  ›  Alen.Toma

系统反射向propertyInfo添加代码

  •  0
  • Alen.Toma  · 技术社区  · 8 年前

    我不熟悉这个系统。反射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);
        }
    
    1 回复  |  直到 8 年前
        1
  •  0
  •   Ňuf    8 年前

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

    财产已更改。福迪

    推荐文章