2012-08-24 10 views
7

tengo un método en la clase Acómo emitir un tipo genérico para adaptarse a otro método genérico

public IList<T> MyMethod<T>() where T:AObject 

Quiero invocar este método en otra clase genérica B. Esta T es sin ningún tipo de limitaciones.

public mehtodInClassB(){ 
    if (typeof(AObject)==typeof(T)) 
    { 
     //Compile error here, how can I cast the T to a AObject Type 
     //Get the MyMethod data 
     A a = new A(); 
     a.MyMethod<T>(); 
    } 
} 

Clase C se hereda de la clase AObject.

B<C> b = new B<C>(); 
b.mehtodInClassB() 

¿Alguna idea?

Después de urs recordando ... Actualización:

Sí. Lo que realmente quiero hacer es

typeof(AObject).IsAssignableFrom(typeof(T)) 
no

typeof(AObject)==typeof(T)) 
+0

Si pudiéramos ver más de lo que hace la otra clase, podríamos brindarle consejos más relevantes. –

+0

¿cuál es el tipo de 'd'? si es el tipo correcto, ¿no puede simplemente invocar MyMethod sin molestarse en pasar el parámetro tipo (por ejemplo, 'd.MyMethod()')? – Chris

+1

@Chris El método es genérico y no toma argumentos. No puede omitir el parámetro de tipo genérico en este caso porque no hay forma de inferirlo del uso. –

Respuesta

7

Si sabe que T es un AObject, ¿por qué no ofrecer AObject como el parámetro de tipo de MyMethod:

if (typeof(AObject).IsAssignableFrom(typeof(T))) 
{ 
    //Compile error here, how can I cast the T to a AObject Type 
    //Get the MyMethod data 
    d.MyMethod<AObject>(); 
} 

Si proporcionar AObject como parámetro de tipo no es una opción, tendrá que poner la misma restricción en T en el método de llamada:

void Caller<T>() where T: AObject 
{ 
    // ... 

    d.MyMethod<T>(); 

    // ... 
} 
+1

Porque AObject es clase base aquí – ValidfroM

+2

Sin embargo, usted sabe qué 'typeof (T)' solo será igual a 'typeof (AObject)' si 'T' es' AObject'. Creo que querías decir 'typeof (AObject) .IsAssignableFrom (typeof (T))' –

+0

@Kendall Frey estuvo de acuerdo. – Dan

1

No se puede hacer eso, a menos que poner la misma restricción sobre el método que contiene. Los genéricos se verifican en tiempo de compilación para que no pueda tomar decisiones de tiempo de ejecución como esa.

Alternativamente, puede usar la reflexión para invocar el método, solo necesita un poco más de código.

ver este SO pregunta para más información sobre cómo hacerlo: How do I use reflection to call a generic method?

+0

Seguramente puede tomar decisiones de tiempo de ejecución siempre que le diga al compilador cuáles son las decisiones. Si lanzas a AObject explícitamente, el compilador sabrá que es un AObject y puede funcionar adecuadamente. – Chris

+0

@Chris ¿Cómo se hace el casting en un parámetro genérico? – CodingGorilla

+0

@Chris El problema aquí es que AObject es una clase base. La T puede ser una clase derivada de AObject, sin idea de cómo lanzarla. – ValidfroM

Cuestiones relacionadas