6

我们在视图模型中执行了很多 INotifyPropertyChanged 实现,坦率地说,由于不便和美观的原因,我们已经厌倦了不得不在我们的代码中显式地触发属性更改事件。

我想在我们的属性的设置器上添加一个扩展,使生成的代码看起来像:

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

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

4

7 回答 7

4

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

这可作为Visual Studio 扩展使用

于 2012-10-19T14:54:22.960 回答
3

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

请参阅C# 中的面向方面编程。还有一些例子:http: //www.codeproject.com/Articles/337564/Aspect-Oriented-Programming-Using-Csharp-and-PostS

您的“set.notify()”可以与一些反射一起使用,但我认为这不是一个好的解决方案,您仍然需要实现 getter 和 setter。

于 2012-10-19T14:52:15.563 回答
3

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

于 2012-10-19T14:52:28.230 回答
2

有没有办法做到这一点?

不,没有,不像你发布的那样。扩展方法对类型进行操作,而不是 getter 或 setter。

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

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

您可以采取其他方法来缓解这种情况 - 例如,使用带有方法的基类,该方法将为您调用样板。

于 2012-10-19T14:53:48.620 回答
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 返回该类型。

于 2012-10-19T14:57:34.813 回答
0

他们没有进入 4.0,但传闻将包含在 5.0 中。

我发现这种方法很有帮助。

于 2012-10-19T14:54:13.357 回答
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!";
    }
}

...我知道,这个问题已经过时了,但它可能会在未来帮助某人。

于 2016-07-08T07:36:25.357 回答