2009-09-21 11 views
8

J'ai une question concernant l'appel de la méthode générique d'une classe avec un paramètre de type connu au moment de l'exécution.Appel d'une fonction générique avec un paramètre de type déterminé à l'exécution

En particulier, le code ressemble à ceci:


FieldInfo[] dataFields = this.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance); 

// data is just a byte array used internally in DataStream 
DataStream ds = new DataStream(data); 

foreach (FieldInfo field in dataFields) 
{ 
    Type fieldType = field.FieldType; 

    // I want to call this method and pass in the type parameter specified by the field's type 
    object objData = (object) ds.Read<fieldType>(); 
} 

La fonction de lecture() ressemble à ceci:


public T Read() where T : struct 

but de cette fonction est de renvoyer des données lues à partir d'un tableau d'octets.

Existe-t-il un moyen d'appeler une méthode générique à l'exécution comme ceci?

Répondre

12

La meilleure façon de gérer ce serait de faire une surcharge non générique de la fonction de lecture avec un seul paramètre Type:

public object Read(Type t) 

Et alors la version générique appeler la version non générique:

public T Read<T>() where T : struct 
{ 
    return (T)Read(typeof(T)) 
} 
+0

Merci pour la réponse, je n'ai jamais vraiment considéré un changement de conception aussi simple. –

+0

Mon problème ne ressemblait pas du tout à la question OP, mais vous avez démontré exactement ce que j'avais besoin de savoir. Merci! – KennyZ

7

Vous aurez besoin de construire un MethodInfo et invoquer la méthode Read:

MethodInfo method = typeof(DataStream).GetMethod("Read"); 
MethodInfo generic = method.MakeGenericMethod(fieldType); 
object objData = generic.Invoke(ds, null); 
+0

Merci encore Reed, votre aide est très appréciée. –

1

Il serait probablement préférable de suivre la route de Lee. Les génériques sont des raccourcis à la conception pour vous éviter d'avoir à écrire du code commun pour de nombreux types de classes. Au moment de la compilation, chaque appel à une méthode ou une classe générique est fondamentalement généré comme une classe complètement séparée.

Beaucoup plus simple à bass juste le type et l'utilisation de réflexion, ce qui est ce que vous auriez à faire de toute façon.

+0

Certes, la méthode de Lee serait également meilleure en termes de performances, car la réflexion supplémentaire pour récupérer le MethodInfo serait un calcul supplémentaire qui pourrait être évité avec sa méthode. –

Questions connexes