2009-09-21 17 views
8

Tengo una pregunta que implica llamar al método genérico de una clase con un parámetro de tipo que se conoce en tiempo de ejecución.Llamar a una función genérica con un parámetro de tipo determinado en el tiempo de ejecución

En concreto, el código es el siguiente manera:


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 función de lectura() se ve así: propósito


public T Read() where T : struct 

de esta función es la de devolver los datos leídos desde una matriz de bytes.

¿Hay alguna manera de llamar a un método genérico en el tiempo de ejecución de esta manera?

Respuesta

12

La forma más fácil de manejar esto sería hacer una sobrecarga no genérico de la función de lectura con un solo parámetro Tipo:

public object Read(Type t) 

y luego tener la versión genérica llamar a la versión no genérica:

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

Gracias por la respuesta, nunca consideré un cambio de diseño tan simple. –

+0

Mi problema no se parecía en nada a la pregunta de OP, pero usted demostró exactamente lo que necesitaba saber. ¡Gracias! – KennyZ

7

tendrá que construir un MethodInfo e invocar el método Read:

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

Gracias de nuevo Reed, su ayuda es muy apreciada. –

1

Probablemente sería mejor ir a la ruta de Lee. Los genéricos son abreviados en el tiempo de diseño para evitar tener que escribir códigos comunes para muchos tipos diferentes de clases. En tiempo de compilación, cada llamada a un método o clase genérico se genera básicamente como una clase completamente separada.

Mucho más simple que solo los bajos y el tipo de reflejo, que es lo que tendrías que hacer de todos modos.

+0

Es cierto que el método de Lee también sería mejor para el rendimiento, ya que la reflexión adicional para recuperar MethodInfo sería un cálculo adicional que podría evitarse con su método. –

Cuestiones relacionadas