我们在View Models中做了很多INotifyPropertyChanged实现,坦白地说,由于不方便和审美原因,我们已经厌倦了在代码中明确地触发属性更改事件。
我想在我们的属性的setter上添加一个扩展,使得结果代码看起来像:
public string LazyAccessor
{
get;
set.notify();
}
有办法做到这一点吗?如果没有,我们可以发明一个吗?
答案 0 :(得分:4)
结帐NotifyPropertyWeaver。这将在构建过程中修改您的代码,以使您的属性实现INotifyPropertyChanged
模式。
答案 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!";
}
}
......我知道,这个问题已经过时了,但未来可能有所帮助。