2009-07-01 7 views
3

J'écris une fonction qui est un mappeur d'un type d'objet à un autre. L'objet qui est passé en paramètre de la méthode Map doit avoir un indexeur de chaîne pour trouver la valeur appropriée dans l'objet (ou non). Je ne me soucie pas vraiment si le mappeur obtient un dictionnaire, DataRow, DataReader, etc.C#: Requiert l'indexeur sur le paramètre de méthode

Existe-t-il un moyen de spécifier que le paramètre passé à la méthode doit implémenter un indexeur de chaîne? Je ne peux pas trouver quelque chose comme ça. Je vais utiliser le reflet pour lancer le type à quelque chose d'utilisable si ce n'est pas possible, mais je me demandais s'il y avait une bonne façon de gérer cela.

Répondre

5

Vous pouvez créer une interface comme ceci:

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

Tous les types qui implémentent cette interface devra mettre en œuvre un indexeur de chaîne et si le type du paramètre à votre méthode est IFoo vous pouvez savoir qu'il avoir un indexeur.

6

Non, vous ne pouvez pas faire cela. Vous pouvez utiliser une interface comme celle d'Andrew, ou vous pouvez passer un Func<T, string> qui récupère une valeur indexée.

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

(crédit à Michael Meadows pour étoffant cette idée dans un exemple. Merci!)

+0

idée vraiment sympa! –

+1

Comme la chose Func ! – Vivek

+0

Merci. L'interface ne le résoudra pas car je ne peux pas ajouter une interface à des classes prédéfinies comme DataRow/Dictionary. Je suppose que l'idée typée est probablement la meilleure façon de résoudre cela! – Jasper

0

À moins que vous pouvez faire tous les objets (ou classes respectivement) que vous souhaitez passer à l'mappeur mettre en œuvre une interface définit un tel indexeur, vous aurez besoin d'utiliser la réflexion.

0

Est-ce une interface pas utile dans ce cas:

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

juste besoin que le paramètre implémente l'interface

Questions connexes