簡體   English   中英

System.Reflection.Emit將代碼添加到propertyInfo

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM