我爲包含虛擬自動屬性的POCO對象實現了一個發射的屬性changed處理程序,並且我得到的代碼可以在propertychanged被提出的地方工作每當我改變基礎財產。這樣做的原因是我與服務器共享一個POCO對象(好或壞),我將發送修改對象到服務器。我無法用屬性裝飾POCO對象(因爲服務器也會有這些裝飾器,因爲我們共享公共類),並且由於策略原因,我無法使用Fody或PostSharp等第三方工具。我需要跟蹤對象是否被修改,並且我堅持這一點。IL Emit - 在notifypropertychanged之前用布爾值設置一個現有的屬性
這裏是一個封裝與變更通知我的虛擬自動屬性的Emit:
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);
我需要做的就是在設置的現有的「IsModified」布爾屬性方法,如果設置物業值<>值。
這裏是想什麼,我發出一個例子(這是目前定義爲POCO虛擬自動性質):
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");
}
}
}
我一直停留在這一段時間...我已經設法在創建的新代理類中創建了一個名爲「NewIsModified」的新屬性,但是,我非常想在原始POCO中重新使用現有的IsModified屬性。
我希望我已經正確地解釋了我的問題,並且很容易理解。任何幫助將不勝感激,我希望它也能幫助別人。
親切的問候。
單絲絲的
!=
是你的一個可接受的解決方案? –