[英]System.Reflection.Emit adding code to propertyInfo
我是System.Reflection.Emit的新手,並嘗試從我的庫中刪除nuget PropertChanged.Fody並構建類似內容。 所以這就是我得到的。 此方法稱為UpdateProperty,但實際上是什么覆蓋了PropertyInfo,因此,如果我的PropertyInfo不是虛擬的,則此代碼將無法工作。 所以有可能只更新我的PropertyInfo集而不創建新的Property嗎?
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);
}
AFAIK沒有正式的方法可以在運行時替換方法主體(或屬性設置器)(除非它是動態方法)。 無論如何,有很多方法可以做到這一點。 看到
但是,當可以在編譯時完成屬性值更改時,注入會引發PropertyChanged方法的代碼(這是PropertyChanged.Fody所做的事情),在我看來,這是優於運行時代碼修改的解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.