我为包含虚拟自动属性的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属性。
我希望我已经正确地解释了我的问题,并且很容易理解。任何帮助将不胜感激,我希望它也能帮助别人。
亲切的问候。
单丝丝的
!=
是你的一个可接受的解决方案? –