2009-07-01 12 views
3

Ich schreibe eine Funktion, die ein Mapper von einem Objekttyp zum anderen ist. Das Objekt, das als Parameter der Map-Methode übergeben wird, sollte einen String-Indexer haben, um den geeigneten Wert im Objekt zu finden (oder nicht). Es ist mir egal, ob der Mapper ein Dictionary, DataRow, DataReader usw. erhält.C#: Require Indexer auf Methodenparameter

Gibt es eine Möglichkeit, dass der an die Methode übergebene Parameter einen String-Indexer implementiert? Ich kann nichts dergleichen finden.

Ich werde Reflexion verwenden, um den Typ zu etwas Brauchbarem zu übertragen, wenn es nicht möglich ist, aber ich fragte mich, ob es einen richtigen Weg gibt, damit umzugehen.

Antwort

5

Sie können eine Schnittstelle wie folgt erstellen:

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

Alle Typen, die diese Schnittstelle implementieren, wird eine Zeichenfolge Indexer implementieren und wenn der Typ des Parameters auf Ihre Methode ist IFoo können Sie wissen, dass es wird habe einen Indexer.

6

Nein, das geht nicht. Sie könnten eine Schnittstelle wie Andrew verwenden, oder Sie könnten eine Func<T, string> übergeben, die einen indizierten Wert abruft.

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]); 
} 

(Credit Michael Meadows für diese Idee in einem Beispiel konkretisieren. Danke!)

+0

Wirklich nette Idee implementiert! –

+1

Wie die Func Sache! – Vivek

+0

Danke. Die Schnittstelle wird es nicht beheben, da ich keine Schnittstelle zu vordefinierten Klassen wie DataRow/Dictionary hinzufügen kann. Ich denke, die typisierte Idee ist wahrscheinlich der beste Weg, dies zu lösen! – Jasper

0

Sofern Sie nicht alle Objekte machen können (oder Klassen jeweils) Sie den Mapper passieren wie eine Schnittstelle implementieren, die definiert solch einen Indexer, müssen Sie die Reflexion verwenden.

0

Würde eine Schnittstelle in diesem Fall nicht helfen:

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

erfordern nur, dass die Parameter der Schnittstelle