2010-07-29 20 views
5

Est-il possible de faire un tel code ceci:Appelez une méthode de paramètre de type

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

Ou, comment appeler une fonction du paramètre de type (type est un peu ma classe personnalisée).

Répondre

2

Pour appeler une méthode d'un objet de type générique, vous devez le récupérer en premier.

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

Est-il possible d'utiliser la classe publique GenericClass où T: SomeType1, SomeType2, new() – Dusan

+0

Non, vous ne pouvez spécifier qu'une seule classe de base (vous pouvez créer une SomeTypeBase, spécifier cela comme contrainte de type et laisser SomeType1 et SomeType3 en hériter Classe SomeTypeBase). – Peter

2

Je pense que vous cherchez generic type constraints:

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

En termes de code affiché - pour appeler quelque chose sur T, vous devrez passer comme paramètre à functionA. La contrainte que vous utiliserez devra s'assurer que toute méthode T a une méthode A qui peut être utilisée.

+0

Non, je cette erreur: « T » est un « paramètre de type », ce qui est valable dans le contexte donné – Dusan

+0

@shandu - réponse mis à jour. Vous devez également fournir le paramètre générique. – Oded

+0

Est-il possible d'utiliser: classe GenericClass où T: MyBaseClass1, MyBaseClass2 – Dusan

6

Re:

T.A();

Vous ne pouvez pas appeler des méthodes statiques du paramètre de type, si c'est ce que vous voulez dire. Vous feriez mieux de refactoriser cela comme une méthode d'instance de T, peut-être avec une contrainte générique (where T : SomeTypeOrInterface, avec SomeTypeOrInterface définissant A()). Une autre alternative est dynamic, ce qui permet de dactylographie de instance méthodes (via signature).

Si vous voulez dire que le T est connu que lors de l'exécution (comme Type), alors vous auriez besoin:

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