属性设置器的PostSharp方面,调用泛型方法

时间:2008-10-29 12:57:39

标签: c# properties aop postsharp

我们有一个基础对象,我们用于一些类似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上。

1 个答案:

答案 0 :(得分:2)

应该很简单。您重写OnEntry并根据您自己的代码设置返回值。最后你使用:

eventArgs.ReturnValue = GetValue(x,y);  
eventArgs.FlowBehavior = FlowBehavior.Return;

将有效拦截原始的Get / Set调用。

请参阅使用相同模式显示缓存方面的this blog ...