0

私は、このユースケースの可能な解決策または代替案が何であるかを知りたいという状況に遭遇しました。

ジェネリックパラメーターを受け入れるメソッドシグネチャを持つクラスがあります。そこで、メソッドシグネチャ自体を汎用にしました。

/// <summary>
///     Input Widget.
/// </summary>
public sealed class InputWidget {
    /// <summary>
    ///     Widget's Control.
    /// </summary>
    public IList<dynamic> Controls { get; private set; }

    public InputWidget AddControl<TC>(InputControl<TC> control) where TC : BaseControl<TC> {
        this.Controls.Add(control);
        return this;
    }
}

そのパラメータをクラスプロパティに割り当てたい場合は、何らかの理由で、プロパティのタイプがobject、または.NET 4で始まらない限り、それを行うことはできませんdynamic

dynamicoverを使用すると、リストから各要素を取得してさらに使用するときに、ジェネリック型にobjectキャストバックする手間を省くことができます。objectしかし、コンパイル型の安全性であるIntellisenseがないため、あまり満足しdynamicていません。注意しないと、実行時に致命的となる可能性があります。

では、なぜ私は自分のクラスがジェネリックであると単純に宣言しないのですか?InputControl特定のタイプのを受け入れるようにメソッドを制限したくないからです。さらに、同じアプローチを必要とする他のメソッドを定義しましたが、省略しました。N個のジェネリック型を使用してクラスを定義するのが退屈な場合。この場合、Nはメソッドの数です。

では、このようなシナリオを処理するための最良のアプローチは何ですか?私は何かが足りないのですか?私は間違って考えていますか?さらに悪いことに、私のデザインは完全に間違っていて、初心者向けの本をもう一度読み始める必要がありますか?

4

1 に答える 1

0

InputControl<TC>コレクション内の各アイテムが異なる可能性がある場所のコレクションを保存する方法を実際に尋ねているようですTC

これを行うには2つの方法があります。

  • コレクションから必要な機能を公開する非ジェネリックの基本クラスまたはインターフェイスを作成し、代わりにそれを保存します。これにより、すべてのメソッドを非汎用にすることもできます

  • InputControl<TC>反変インターフェースに置き換えて、を使用しList<IInputControl<BaseControl>>ます。IInputControl<TC>共変性を使用すると、任意のsをに変換できますIInputControl<BaseControl>

于 2013-01-20T13:52:25.890 に答える