ビュー モデルで多くの INotifyPropertyChanged の実装を行っていますが、率直に言って、コード内で明示的にプロパティ変更イベントを起動する必要があることにうんざりしています。
プロパティのセッターに拡張機能を追加して、結果のコードを次のようにします。
public string LazyAccessor
{
get;
set.notify();
}
これを行う方法はありますか?存在しない場合、発明できますか?
ビュー モデルで多くの INotifyPropertyChanged の実装を行っていますが、率直に言って、コード内で明示的にプロパティ変更イベントを起動する必要があることにうんざりしています。
プロパティのセッターに拡張機能を追加して、結果のコードを次のようにします。
public string LazyAccessor
{
get;
set.notify();
}
これを行う方法はありますか?存在しない場合、発明できますか?
アスペクト指向プログラミングは、問題の解決策になる可能性があります。
C# でのアスペクト指向プログラミングを参照してください。ここにいくつかの例があります: http://www.codeproject.com/Articles/337564/Aspect-Oriented-Programming-Using-Csharp-and-PostS
あなたの「set.notify()」はリフレクションで動作する可能性がありますが、これは良い解決策ではないと思います.getterとsetterを実装する必要があります.
拡張メソッドは、タイプにのみ追加できます。自動プロパティのゲッターとセッターは、コンパイラによってバッキング変数を持つメソッドに変換されるため、それらに拡張メソッドを配置する方法はありません。
これを行う方法はありますか?
いいえ、あなたが投稿したようではありません。拡張メソッドは、ゲッターやセッターではなく、型で動作します。
存在しない場合、発明できますか?
それには C# 仕様の変更が必要になりますが、それは起こりそうにありません。
これを容易にするために取ることができる他のアプローチがあります - たとえば、ボイラープレート呼び出しを行うメソッドで基本クラスを使用します。
カスタム汎用構造体の変換演算子をオーバーライドすることで、手動でイベントを呼び出さずに「プロパティのような」動作をエミュレートできます。以下は私の解決策です:
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!";
}
}
...私は知っています、質問は時代遅れですが、将来誰かを助けるかもしれません.
それらは 4.0 には含まれませんでしたが、5.0 に含まれると噂されています。
このアプローチが役立つことがわかりました。