Ich implementiere einen emmitting proposechanged-Handler für mein POCO-Objekt mit virtuellen Auto-Eigenschaften, und ich habe Code, der an dem Punkt funktioniert, an dem propertychange ausgelöst wird wenn ich die zugrunde liegende Eigenschaft ändere. Der Grund dafür ist, dass ich ein POCO-Objekt mit dem Server teile (zum Guten oder zum Schlechten), wo ich modifizierte Objekte an den Server senden werde. Ich kann das POCO-Objekt nicht mit Attributen dekorieren (da der Server auch diese Dekoratoren hätte, da wir die gemeinsame Klasse teilen) und ich kann aufgrund von Richtlinien keine Tools von Drittanbietern wie Fody oder PostSharp verwenden. Ich muss verfolgen, ob das Objekt geändert wurde, und ich stecke darauf fest.IL Emit - setze eine existierende Eigenschaft mit einem booleschen Wert vor notifypropertychanged
Hier ist die Emit, dass meine virtuelle Auto-Eigenschaften mit Änderungsbenachrichtigung Wraps:
MethodBuilder setMethodBuilder = typeBuilder.DefineMethod(setMethod.Name, setMethod.Attributes, setMethod.ReturnType, types.ToArray());
typeBuilder.DefineMethodOverride(setMethodBuilder, setMethod);
ILGenerator wrapper = setMethodBuilder.GetILGenerator();
...Emit if property <> value IsModified=true here...
wrapper.Emit(OpCodes.Ldarg_0);
wrapper.Emit(OpCodes.Ldarg_1);
wrapper.EmitCall(OpCodes.Call, setMethod, null);
Was muss ich die Methode des bestehenden gesetzt tun bekommen ist „IsModified“ boolean Eigenschaft und legen Sie es, wenn der Eigenschaftswert <> Wert.
Hier ist ein Beispiel dafür, was Ich mag würde emittieren (dies derzeit als POCO mit virtuellen Auto-Eigenschaften definiert ist):
public class AnEntity
{
string _myData;
public string MyData
{
get
{
return _myData;
}
set
{
if(_myData <> value)
{
IsModified = true;
_myData = value;
OnPropertyChanged("MyData");
}
}
}
bool _isModified;
public bool IsModified { get; set; }
{
get
{
return _isModified;
}
set
{
_isModified = value;
OnPropertyChanged("IsModified");
}
}
}
Ich habe auf diesem für eine Weile stecken geblieben ... Ich habe es geschafft, eine neue Eigenschaft namens "NewIsModified" in der neuen Proxy-Klasse zu erstellen, die erstellt wurde, jedoch möchte ich die vorhandene IsModified-Eigenschaft in meinem ursprünglichen POCO sehr gerne wiederverwenden.
Ich hoffe, ich habe meine Frage richtig erklärt und ist leicht zu verstehen. Jede Hilfe würde sehr geschätzt werden, und ich hoffe, dass es auch anderen helfen wird.
Mit freundlichen Grüßen.
mono cecil ist eine akzeptable Lösung für Sie? –