2010-07-29 15 views
5

¿Hay alguna manera de hacer tal código siguiente:Llamar a un método de parámetro de tipo

class GenericClass<T> 
{ 
    void functionA() 
    { 
     T.A(); 
    } 
} 

O, cómo llamar a una función del parámetro de tipo (tipo es un poco de mi clase personalizada).

Respuesta

2

Para llamar a un método de un objeto de tipo genérico que tiene que crear una instancia por primera vez.

public static void RunSnippet() 
{ 
    var c = new GenericClass<SomeType>(); 
} 

public class GenericClass<T> where T : SomeType, new() 
{ 
    public GenericClass(){ 
     (new T()).functionA(); 
    } 
} 

public class SomeType 
{ 
    public void functionA() 
    { 
     //do something here 
     Console.WriteLine("I wrote this"); 
    } 
} 
+0

¿Es posible utilizar clase pública GenericClass donde T: SomeType1, SomeType2, new() – Dusan

+0

No, solo puede especificar una clase base (puede crear un SomeTypeBase, especificar esto como la restricción de tipo y dejar que SomeType1 y SomeType3 hereden de este Clase SomeTypeBase). – Peter

2

creo que busca generic type constraints:

class GenericClass<T> where T : MyBaseClass 
{ 
    void functionA<T>(T something) 
    { 
     something.A(); 
    } 
} 

En términos del código que envió - con el fin de llamar a algo en T, tendrá que pasarlo como un parámetro para functionA. La restricción que use deberá garantizar que cualquier T tenga un método A que se pueda usar.

+0

No, tengo este error: 'T' es un 'parámetro de tipo', que no es válida en el contexto – Dusan

+0

@shandu dados - respuesta actualizada. También debe proporcionar el parámetro genérico. – Oded

+0

¿Es posible utilizar: class GenericClass donde T: MyBaseClass1, MyBaseClass2 – Dusan

6

Re:

T.A();

no puede llamar a métodos estáticos del tipo de parámetro, si eso es lo que quiere decir. Haría mejor en refactorizar eso como un método de instancia de T, quizás con una restricción genérica (where T : SomeTypeOrInterface, con SomeTypeOrInterface definiendo A()). Otra alternativa es dynamic, que permite el tipado de pato de los métodos instancia (mediante firma).

Si se refiere a que el T sólo se conoce en tiempo de ejecución (como Type), entonces usted tendría que:

typeof(GenericClass<>).MakeGenericType(type).GetMethod(...).Invoke(...); 
Cuestiones relacionadas