我不熟悉这个系统。反射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);
}