J'implémente un gestionnaire propertychanged émis pour mon objet POCO contenant des auto-propriétés virtuelles, et j'ai du code qui fonctionne au point où propertychanged est levé chaque fois que je change la propriété sous-jacente. La raison pour cela est que je partage un objet POCO avec le serveur (pour le meilleur ou pour le pire), où je vais envoyer des objets modifiés au serveur. Je ne peux pas décorer l'objet POCO avec des attributs (puisque le serveur aurait également ces décorateurs, car nous partageons la classe commune) et je ne peux pas utiliser des outils tiers tels que Fody ou PostSharp en raison de politiques. J'ai besoin de savoir si l'objet a été modifié, et je suis coincé là-dessus.IL Emit - définit une propriété existante avec une valeur booléenne avant notifypropertychanged
Voici le Emit qui enveloppe mes auto-propriétés virtuelles avec notification de modification:
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);
Ce que je dois faire est d'obtenir la définir la méthode de l'existant « IsModified » propriété booléenne et définissez si la valeur de la propriété <> valeur.
Voici un exemple de ce que je voudrais émettre (ce qui est actuellement définie comme POCO avec auto-propriétés virtuelles):
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");
}
}
}
Je suis coincé sur ce pendant un certain temps ... J'ai réussi à créer une nouvelle propriété appelée "NewIsModified" dans la nouvelle classe proxy qui a été créée, mais j'aimerais beaucoup réutiliser la propriété IsModified existante dans mon POCO d'origine. J'espère avoir bien expliqué ma question et que je peux la comprendre facilement. Toute aide serait grandement appréciée, et j'espère que cela aidera aussi quelqu'un d'autre.
Cordialement.
mono est cecil une solution acceptable pour vous? –