我们有一个基础对象,我们用于一些类似MVC的系统,其中后代中的每个属性都是这样编写的:
public String FirstName
{
get { return GetProperty<String>("FirstName", ref _FirstName); }
set { SetProperty<String>("FirstName", ref _FirstName, value); }
}
这样做既可用于调试目的,也可用于通知和验证目的。我们使用getter来提醒我们代码已明确标记它将要读取的内容(为了使基类只能在这些属性发生变化时才能调用它)并且出错它,我们使用setter用于属性更改通知,脏标处理,验证等。
为简单起见,我们假设这些方法的实现如下:
protected T GetProperty<T>(String propertyName,
ref T backingField)
{
return backingField;
}
protected Boolean SetProperty<T>(String propertyName,
ref T backingField,
T newValue)
{
backingField = newValue;
return true;
}
当然,这两个代码都有更多代码,但这段代码与我的问题无关,或者至少我希望如此。如果是,我会修改问题。
无论如何,我想编写一个PostSharp方面,自动为我调用自动属性,如下所示:
public String FirstName { get; set; }
那里有没有人知道我会怎么做呢?
我自己创建了OnMethodBoundaryAspect类,但是使用ref参数调用泛型实现的艺术却让我感到不适。
这是两个类,我想扩充TestObject类,以便在属性get和set上自动调用正确的方法。
public class BaseObject
{
protected T GetProperty<T>(String propertyName,
ref T backingField)
{
return backingField;
}
protected Boolean SetProperty<T>(String propertyName,
ref T backingField,
T newValue)
{
backingField = newValue;
}
}
public class TestObject : BaseObject
{
public String FirstName
{
get;
set;
}
public String LastName
{
get;
set;
}
}
修改:也发布在PostSharp forum上。
答案 0 :(得分:2)
应该很简单。您重写OnEntry并根据您自己的代码设置返回值。最后你使用:
eventArgs.ReturnValue = GetValue(x,y);
eventArgs.FlowBehavior = FlowBehavior.Return;
将有效拦截原始的Get / Set调用。
请参阅使用相同模式显示缓存方面的this blog ...