2012-10-19 6 views
6

私たちはView ModelでINotifyPropertyChangedの実装をたくさん行っています。不便さと審美的理由のために、コードで明示的にプロパティ変更イベントを発生させなければならなくなっています。Property Accessorに拡張メソッドを追加する

私のような結果のコードを見ながら、私たちの財産のセッターに拡張子を入れたい

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

はこれを行う方法はありますか?もし存在しなければ、私たちは一つを作り出すことができますか?

答えて

3

アスペクト指向プログラミングは、あなたの問題の解決策になる可能性があります。

Aspect Oriented Programming in C#を参照してください。 ここではいくつかの例を示します:http://www.codeproject.com/Articles/337564/Aspect-Oriented-Programming-Using-Csharp-and-PostS "set.notify()"はReflectionで動作しますが、これは良い解決策ではないと思うし、getterとsetterを実装する必要があります。

3

Extension methodsは、タイプにのみ追加できます。自動プロパティのgetterとsetterは、のメソッドにコンパイラによってバッキング変数が設定されているため、拡張メソッドを追加する方法はありません。

2

これを行う方法はありますか?

いいえ、あなたは投稿していません。拡張メソッドはタイプで動作しますが、getterやsetterでは動作しません。

もし存在しなければ1つを発明できますか?

これは、C#仕様の変更が必要になる可能性があります。

これを簡単にするための方法として、ボイラープレートがあなたのために呼び出される方法でベースクラスを使用する方法があります。

+0

もう1つ興味深いアプローチです。私の答えを見て、それも実行可能かどうかを見てください。あなたの評判があなたに先んじてあなたの意見を評価します。多分重すぎますか? –

0

彼らは4.0にしなかったが、5.0に含まれると噂されている。

私はthisアプローチが役に立ちました。

4

チェックアウトNotifyPropertyWeaver。これにより、ビルドプロセス中にコードが変更され、プロパティにINotifyPropertyChangedパターンが実装されます。

これは、あなたがセット自体にそれを行うことができませんでしたVisual Studio Extension

+0

これはPostSharpのようなものでAOPの先駆けだったのでしょうか、PostSharpが存在するかどうか分からなかったでしょうか? –

+0

@BigMどのように働いているかの詳細については本当にわかりません。彼らはどちらもIL製織を使用していることを知っています。したがって、彼らは概念が似ています。私がNotifyPropertyWeaverを使う理由は、あなたのコードを属性で混乱させる必要がないからです。 – cadrell0

+0

このソリューションを使用するのは正当な理由です。 PostSharpは***非常に一般的です***これは** **苦痛の点を解決するのに適しています、それは確かにより簡潔になるでしょう! –

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から返します。

+0

私はよく分かりませんが、私はNotifyPropertyEventを発生させるために、元のオブジェクト(送信者)とプロパティ名(このサンプルでは "LazyAccessor")を知る必要があります。だから、あなたのコードはそれをさらに冗談にします。 – Ondra

+0

あなたは元のオブジェクトを持っています... NotifyAccessorSet関数の "値"になります。いずれにしても...ちょっとした提案。このアプローチは、追加の関数呼び出しを実装します。これはsetメソッドで通知を実装する方法を提供するだけです。 – DRobertE

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!"; 
    } 
} 

...私は知っていますが、質問は時代遅れですが、将来的に誰かを助けるかもしれません。

関連する問題