2

我们有一个用于一些类似 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 类以自动调用属性获取和设置的正确方法。

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 论坛上。

4

1 回答 1

2

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

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

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

请参阅此博客,它使用相同的模式显示缓存方面...

于 2008-11-03T23:17:35.223 回答