2017-09-28 8 views
0

私はSystem.Reflection.Emitに新しく、私のライブラリーからnuget PropertChanged.Fodyを削除しようとしています。 これは私が得たものです。 このメソッドはUpdateProperty buと呼ばれます。本当に線量がPropertyInfoをオーバーライドしているので、PropertyInfoが仮想でない場合、このコードは機能しません。 新しいPropertyを作成せずにPropertyInfo Setのみを更新することは可能ですか?System.Reflection.example.fmit 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); 
    } 

答えて

0

メソッド本体(またはプロパティのセッターを)交換する公式の方法は、(それが動的な方法でない限り)実行時に私の知る限りではありません。しかし、とにかくそれを行う方法の数があります。

しかし、プロパティ値の変更は、コンパイル時に行うことができるときにPropertyChangedメソッドを上げる(PropertyChanged.Fodyが何をするかである)と、それが思わコードを注入することを参照してください。私はランタイムコードの変更よりも好ましい解決策です。

+0

私はあなたが何を意味するか見ることができますが、propertyInfoの設定者はsealdであり、これらのリンクが機能するとは思っていません。私はこのようなものが好きです。var user = ()を取得しました。ユーザーは新しいアッシーで新しいタイプを作成せずにこれらの変更を実装しました。 rihjt今Mono.Cecilとその良いを見ていますが、それはサポートしていません.netコア2 creazyです –

関連する問題