2009-09-21 20 views
8

Ho una domanda che riguarda il richiamo di un metodo generico di classe con un parametro di tipo noto al runtime.Chiamare una funzione generica con un parametro di tipo determinato in fase di esecuzione

Nello specifico, il codice appare in questo modo:


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 funzione Read() appare in questo modo: scopo


public T Read() where T : struct 

di questa funzione è quella di restituire i dati letti da un array di byte.

C'è un modo per chiamare un metodo generico in fase di esecuzione come questo?

risposta

12

Il modo più semplice per gestire questo sarebbe quello di fare un sovraccarico di non generico della funzione Read con un unico parametro Type:

public object Read(Type t) 

e quindi avere la versione generica chiamare la versione non generica:

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

Grazie per la risposta, non ho mai considerato un cambiamento di design così semplice. –

+0

Il mio problema non assomigliava affatto alla domanda OP, ma hai dimostrato esattamente quello che dovevo sapere. Grazie! – KennyZ

7

Avrai bisogno di costruire un MethodInfo e richiamare il metodo Read:

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

Grazie ancora Reed, il tuo aiuto è molto apprezzato. –

1

Probabilmente sarebbe meglio seguire la rotta di Lee. I generici sono in fase di progettazione in fase di progettazione per impedirti di scrivere codice comune per molti diversi tipi di classi. Al momento della compilazione ogni chiamata a un metodo o una classe generici viene sostanzialmente generata come una classe completamente separata.

Molto più semplice solo il basso il tipo e utilizzare il riflesso, che è quello che si dovrebbe fare comunque.

+0

Vero, il metodo di Lee sarebbe anche migliore dal punto di vista delle prestazioni, in quanto il riflesso aggiuntivo per recuperare il MethodInfo sarebbe un calcolo addizionale che potrebbe essere evitato con il suo metodo. –

Problemi correlati