2009-07-01 3 views
3

メソッドのパラメータにインデクサーを必要としています。地図メソッドのパラメータとして渡されるオブジェクトは、オブジェクト(またはしない)に適切な値を見つけるために、文字列インデクサを持つ必要があります。マッパーがDictionary、DataRow、DataReaderなどを取得するかどうかは本当に気にしません。C#の:私は別のオブジェクトの1種類からマッパーである機能を書いて

メソッドに渡されるパラメータが文字列インデクサを実装する必要があるかどうかを特定する方法はありますか?私はそれのような何かを見つけることができません。

私はそれが不可能な場合は、使用可能なものにタイプをキャストするためにリフレクションを使用しますが、これを処理するための適切な方法がある場合、私は思っていました。

答えて

5

あなたはこのようなインターフェイスを作成することができます

interface IFoo 
{ 
    String this[Int32 index] { get; set; } 
} 

文字列インデクサを実装する必要があります。このインターフェイスを実装して、メソッドのパラメータの型がある場合IFooあなたはそれがすることを知ることができるすべての種類をインデクサを持っている。

6

いいえ、あなたはそれを行うことはできません。あなたはAndrew'sのようなインターフェースを使うことができます。または、Func<T, string>を渡して、インデックス値を取得することができます。

public void ConsumeIndexedFunction<T>(Func<string, T> something) 
{ 
    var foo = something("bar"); 
    // do something with foo 
} 

public void TestMethod(
    Dictionary<string, object> myDictionary, 
    DataTable myDataTable, 
    IDataReader myDataReader) 
{ 
    ConsumeIndexedFunction(x => myDictionary[x]); 
    ConsumeIndexedFunction(x => myDataTable.Rows[0][x]); 
    ConsumeIndexedFunction(x => myDataReader[x]); 
} 

(例にこのアイデアを肉付けのためのマイケル・メドウズの功績によるものです。感謝!)

+0

本当に素敵なアイデアを実装することを必要と! Func ことのよう –

+1

! – Vivek

+0

ありがとうございます。私はDataRow/Dictionaryのようなあらかじめ定義されたクラスにインターフェイスを追加することができないので、インターフェイスはそれを修正しません。私は、型指定されたアイデアは、おそらくこれを解決するための最も素晴らしい方法ですね! – Jasper

0

ます(それぞれまたはクラス)すべてのオブジェクトを作ることができない限り、あなたはマッパーに渡すのが好きどのインタフェースを実装そのようなインデクサを定義する場合は、リフレクションを使用する必要があります。

0

インタフェースは、この場合には役に立たない:

interface IImplementMe { 
    string this[int index] 
    { 
     get; 
     set; 
    } 
} 

ただパラメータがインターフェイス

関連する問題