1

C# でパラメーター化されたプロパティを実装するために使用できるジェネリック クラスを作成したいと考えています。私が欲しい基本的なコードはこれです:

public class ParameterizedProperty<typeReturn, typeIndexer> {
    private typeReturn oReturn = default(typeReturn);

    public typeReturn this[typeIndexer oIndexer] {
        get { return oReturn[oIndexer]; }
        set { oReturn[oIndexer] = value; }
    }
}

しかし、typeReturn未知/無制限であるため、コンパイラは行にプロットしていoReturn[oIndexer]ます。

では、どうすればこれを機能させることができますか?私の最初の(まあ、2番目の)考えは、リフレクションを使用して条件付きでインデクサーを見つける(見つからない場合はエラーを発生させる)かwhere typeReturn: I???、クラス定義で修飾子を使用することです。しかし、修飾子を使用すると、どうなるでしょI???うか?

この問題の解決策をありがとう!

注: リフレクションを介してインデクサーを正しく見つける方法は、(おそらく) http://www.dotnet247.com/247reference/msgs/3/16665.aspx (最後のメッセージを参照) にあります。

編集:マシューが以下で指摘したように...私は元の説明にタイプミス/バグのようなものがあります...私自身のせいです、本当に...もともと寝る直前にこれを書いていました!私が望むコードは、次のようになります。

public class ParameterizedProperty<typeReturn, typeIndexer> {
    private typeReturn[] oReturn;

    public ParameterizedProperty(typeReturn[] oSource) {
        oReturn = oSource;
    }

    public typeReturn this[typeIndexer oIndexer] {
        get { return oReturn[oIndexer]; }
        set { oReturn[oIndexer] = value; }
    }
}

...そして、あなたはそれがうまくいくと思いますか!?

ええと、そうではありません!(「int-able」型が欲しい) という不満はまだtypeIndexerありますが、はるかに優れています! また、厄介な「oReturnを実際に何にも設定できない」問題を解決するためにコンストラクターを追加しました=)

しかし、これでも正しく見えません (配列は常に INT によってインデックス付けされますよね? そうであれば、typeIndexer は必要ありません)... 明日の作業でもう一度確認する必要があります =)

4

2 に答える 2

3

これらの行に沿って何かが必要です:

public class ParameterizedProperty<typeReturn, typeIndexer> {
    private Dictionary<typeIndexer, typeReturn> oReturn = new Dictionary<typeIndexer, typeReturn>();

    public typeReturn this[typeIndexer oIndexer] {
        get { return oReturn[oIndexer]; }
        set { oReturn[oIndexer] = value; }
    }
}
于 2010-06-20T14:29:31.847 に答える
1

このインデックス付きプロパティの getter または setter に特定のビジネス ロジックをアタッチすることを気にしていないことは明らかなので (C# の既定のインデクサーや VB.NET の任意のプロパティで行うことができるように)、内部ストレージ メカニズムが必要です。これを達成します。

public class ParameterizedProperty<TReturn, TIndexer>
{
    private Dictionary<TIndexer, TReturn> storage = new Dictionary<TIndexer, TReturn>();

    public TReturn this[TIndexer index]
    {
        get
        {
            TReturn output;

            storage.TryGetValue(index, out output);

            return output;
        }
        set { storage[index] = value; }
    }
}

しかし、これが実際に行うことは、 a に似た構造を提供することだけですがDictionary、インデックスが存在しない場合でも例外はスローされません。

于 2010-06-20T14:31:18.117 に答える