向Property Accessor添加扩展方法

时间:2012-10-19 14:48:06

标签: c# extension-methods accessor

我们在View Models中做了很多INotifyPropertyChanged实现,坦白地说,由于不方便和审美原因,我们已经厌倦了在代码中明确地触发属性更改事件。

我想在我们的属性的setter上添加一个扩展,使得结果代码看起来像:

public string LazyAccessor
{
  get;
  set.notify();
}

有办法做到这一点吗?如果没有,我们可以发明一个吗?

7 个答案:

答案 0 :(得分:4)

结帐NotifyPropertyWeaver。这将在构建过程中修改您的代码,以使您的属性实现INotifyPropertyChanged模式。

这是Visual Studio Extension

答案 1 :(得分:3)

面向方面的编程可以解决您的问题。

Aspect Oriented Programming in C#。 这里有一些例子:http://www.codeproject.com/Articles/337564/Aspect-Oriented-Programming-Using-Csharp-and-PostS

你的“set.notify()”可以与一些Reflection一起工作,但我不认为这是一个很好的解决方案,你仍然需要实现getter和setter。

答案 2 :(得分:3)

Extension methods只能添加到类型。自动属性上的getter和setter由编译器转换为带有支持变量的方法,因此无法在它们上放置扩展方法。

答案 3 :(得分:2)

  

有办法做到这一点吗?

不,没有,不像你发布的那样。扩展方法在类型上运行,而不是在getter或setter上运行。

  

如果没有,我们可以发明一个吗?

这需要更改C#规范 - 不太可能发生。

您可以采取其他方法来缓解这种情况 - 例如,使用一个基类,该方法将使锅炉板为您调用。

答案 4 :(得分:0)

他们没有进入4.0,但据传将被列入5.0。

我发现this方法很有帮助。

答案 5 :(得分:0)

你无法在套装上做到这一点。这是一个动作。但是你可以这样做:

public static class extensions()
{
  public static NotifyAccessorSet(this string value) { some code }
}

public class SomeClass()
{
  .....
  private string mAccessor;

  public string LazyAccessor{
     get { return mAccessor; }
     set { mAccessor = value; mAccessor.NotifyAccessorSet(); }
  }

}

这有点偏离我的脑海,并记住扩展方法将适用于所有类型字符串,因此您可能希望实现自己的返回类型并将扩展方法应用于它。然后从lazyaccessor返回该类型。

答案 6 :(得分:0)

你可以效仿一个类似于'属性的'通过覆盖自定义通用结构的转换运算符而无需手动调用事件的行为。 以下是我的解决方案:

public struct column<TType>
{
    private TType _value;

    private column(TType value) : this()
    {
        _value = value;
    }

    private void Set(TType value)
    {
        // Implement your custom set-behavior...
    }

    private TType Get()
    {
        // Implement your custom get-behavior...
        return _value;
    }

    public override string ToString()
    {
        return _value.ToString();
    }

    public static implicit operator column<TType>(TType p)
    {
        column<TType> column = new column<TType>(p);
        column.Set(p);
        return column;
    }

    public static implicit operator TType(column<TType> p)
    {
        return p.Get();
    }
}

我使用泛型参数声明结构,以避免转换错误。您可以像这样使用它:

public class Test
{
    public column<int> kKey;

    public column<float> dMoney;

    public column<string> cValue;


    public Test()
    {
        kKey   = 42;
        dMoney = 3.1415926f;
        cValue = "May the force be with you!";
    }
}

......我知道,这个问题已经过时了,但未来可能有所帮助。