我们在视图模型中执行了很多 INotifyPropertyChanged 实现,坦率地说,由于不便和美观的原因,我们已经厌倦了不得不在我们的代码中显式地触发属性更改事件。
我想在我们的属性的设置器上添加一个扩展,使生成的代码看起来像:
public string LazyAccessor
{
get;
set.notify();
}
有没有办法做到这一点?如果没有,我们能发明一个吗?
我们在视图模型中执行了很多 INotifyPropertyChanged 实现,坦率地说,由于不便和美观的原因,我们已经厌倦了不得不在我们的代码中显式地触发属性更改事件。
我想在我们的属性的设置器上添加一个扩展,使生成的代码看起来像:
public string LazyAccessor
{
get;
set.notify();
}
有没有办法做到这一点?如果没有,我们能发明一个吗?
查看NotifyPropertyWeaver。这将在构建过程中修改您的代码,以使您的属性实现该INotifyPropertyChanged
模式。
面向方面的编程可以解决您的问题。
请参阅C# 中的面向方面编程。还有一些例子:http: //www.codeproject.com/Articles/337564/Aspect-Oriented-Programming-Using-Csharp-and-PostS
您的“set.notify()”可以与一些反射一起使用,但我认为这不是一个好的解决方案,您仍然需要实现 getter 和 setter。
扩展方法只能添加到类型。自动属性上的 getter 和 setter 被编译器转换为带有支持变量的方法,因此无法在它们上放置扩展方法。
有没有办法做到这一点?
不,没有,不像你发布的那样。扩展方法对类型进行操作,而不是 getter 或 setter。
如果没有,我们能发明一个吗?
这将需要更改 C# 规范——这不太可能发生。
您可以采取其他方法来缓解这种情况 - 例如,使用带有方法的基类,该方法将为您调用样板。
你不能在片场本身做到这一点。那是一个动作。但是,您可能可以这样做:
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 返回该类型。
他们没有进入 4.0,但传闻将包含在 5.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!";
}
}
...我知道,这个问题已经过时了,但它可能会在未来帮助某人。