【问题标题】:PostSharp aspect for property setters, calling generic method属性设置器的 PostSharp 方面,调用通用方法
【发布时间】:2011-04-19 23:29:57
【问题描述】:

我们有一个用于一些类似 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 forum

【问题讨论】:

    标签: c# properties aop postsharp


    【解决方案1】:

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

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

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

    参考this blog,它使用相同的模式显示缓存方面...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-21
      • 1970-01-01
      • 2018-05-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多