1

おそらく別の戦略があるかもしれませんが、私は多くの値を設定できる設定アプリケーションを持っています。各タイプのコントロール (テキストボックス、チェックボックス、コンボボックス、datagridiew) に、ユーザーが値を編集するたびに設定される IsDirty フラグがあれば便利かもしれないと考えていました。

当然、それぞれをユーザー コントロールにラップすることもできますが、これらのそれぞれに対してユーザー コントロールを作成する必要がないように、拡張メソッドなどに似た方法があるかどうか疑問に思っていました。

何かご意見は?

ありがとうマット

4

2 に答える 2

4

オブジェクトにプロパティを「追加」するために使用するように設計された .NET のConditionalWeakTableを確認してください。これは、拡張メソッドで効果的に使用できます。

public static class DirtyExtensions {
    private class ExtraPropertyHolder {
        public bool IsDirty { get; set; }
    }

    private static readonly ConditionalWeakTable<Control, ExtraPropertyHolder> _isDirtyTable 
        = new ConditionalWeakTable<Control, ExtraPropertyHolder>();    

    public static bool IsDirty(this Control @this) {
        return _isDirtyTable.GetOrCreateValue(@this).IsDirty;
    }

    public static void SetIsDirty(this Control @this, bool isDirty) {
        _isDirtyTable.GetOrCreateValue(@this).IsDirty = value;
    }
}

ConditionalWeakTable を使用する大きな利点は、(弱参照を介して) スレッド セーフとガベージ コレクションを正しく処理しながら、すべての .NET クラスを UserControl でラップする必要がないことです。

于 2012-10-02T00:32:25.640 に答える
2

あなたは WinForm ランドにいるように聞こえるので、これらのシナリオではカスタムエクステンダー プロバイダー(サンプル実装) がうまく機能する可能性があります。基本的に、すべてのコントロールである Control オブジェクトから派生したオブジェクトにプロパティを追加します (プロパティが設定されている場合は動作を処理します)。

于 2012-10-02T00:42:50.383 に答える