6

自動プロパティの get/set メソッドにカスタム動作を追加する方法があるかどうか知りたいです。

私が考えることができる明らかなケースは、実装の一部として、すべての set プロパティ メソッドが任意のPropertyChangedイベント ハンドラーで呼び出されるようにすることです。System.ComponentModel.INotifyPropertyChangedこれにより、各プロパティが自動プロパティ構文を使用して定義される、監視可能な多数のプロパティをクラスに含めることができます。

基本的に、クラス スコープを持つ get/set テンプレートまたは post get/set フックに似たものがあるかどうか疑問に思っています。

(同じ最終機能は、もう少し冗長な方法で簡単に実現できることを知っています-パターンの重複が嫌いです)

4

6 に答える 6

17

いいえ、カスタム動作には「従来の」プロパティ定義を使用する必要があります。

于 2008-09-22T17:10:37.550 に答える
4

いいえ、できません: auto プロパティは、プライベート フィールドへの明示的なアクセサーのショートカットです。例えば

public string Name { get; set;} 

へのショートカットです

private string _name;
public string Name { get { return _name; } set { _name = value; } };

カスタム ロジックを配置する場合は、get と set を明示的に記述する必要があります。

于 2008-09-22T17:12:46.203 に答える
2

PostSharpを見てください。これは、「1 日に何百回も実行するこのコード パターンを自動化するにはどうすればよいですか?」という典型的な問題のための AOP フレームワークです。PostSharp でこれを簡略化できます (例):

public Class1 DoSomething( Class2 first, string text, decimal number ) {
    if ( null == first ) { throw new ArgumentNullException( "first" ); }
    if ( string.IsNullOrEmpty( text ) ) { throw new ArgumentException( "Must be not null and longer than 0.", "text" ) ; }
    if ( number < 15.7m || number > 76.57m ) { throw new OutOfRangeArgumentException( "Minimum is 15.7 and maximum 76.57.", "number"); }

    return new Class1( first.GetSomething( text ), number + text.Lenght );
}

    public Class1 DoSomething( [NotNull]Class2 first, [NotNullOrEmpty]string text, [InRange( 15.7, 76.57 )]decimal number ) {
        return new Class1( first.GetSomething( text ), number + text.Lenght );
}

でもこれが全てじゃない!:)

于 2008-09-22T17:27:20.083 に答える
1

これが開発中に何度も繰り返される動作である場合は、特別なタイプのプロパティ用のカスタム コード スニペットを作成できます。

于 2008-09-22T17:12:23.427 に答える
1

PostSharpを使用してセッターのインターセプターを作成することを検討できます。使用するライブラリの部分に応じて、LGPL と GPL の両方になります。

于 2008-09-22T17:12:59.463 に答える
1

私が考えることができる最も近い解決策は、ヘルパーメソッドを使用することです:

public void SetProperty<T>(string propertyName, ref T field, T value)
 { field = value;
   NotifyPropertyChanged(propertyName);
 }

public Foo MyProperty 
 { get { return _myProperty}
   set { SetProperty("MyProperty",ref _myProperty, value);}
 } Foo _myProperty;
于 2008-09-22T17:18:42.447 に答える