2009-09-23 8 views
1

En C#, il est possible de créer une liste de fonctions comme ceci:Déclarant type pour une fonction sans canevas en C#

var myList = new List< Func<Foo> >(); 

Cela permettra à des fonctions (délégués) qui ne prennent pas des arguments et renvoient une valeur de type Foo à ajouter à la liste. Donc, quelque chose comme:

Foo myFunc1() { ... } 

serait un membre valide de cette liste. Ma question est, comment puis-je déclarer le type pour une fonction templatisée? Comment puis-je construire une liste <> qui contiendra des fonctions de la forme:

T myFunc2<T>() { ... } 

Répondre

0

Oui cette première signature est tout à fait valable.

La signature de la dernière fonction est le suggérez

List<Func<T>> x; 

suivant Cela est une liste des délégués qui prennent aucun argument et produire une valeur de T.

2

Vous devez le faire à l'intérieur d'une classe ou d'une méthode modélisée. Ensuite, vous pouvez vous référer au type générique T comme vous le feriez avec le type spécifique Foo.

En d'autres termes:

public class FuncContainer<T> 
{ 
    private List<Func<T>> list = new List<Func<T>>(); 

    public void Fill() 
    { 
     // Initialize list 
    } 
} 
1

Je pense que les autres réponses à ce jour ont mal compris le problème ... et je ne pense pas que vous pouvez réellement le faire, si je l'ai lu correctement . Ai-je raison de dire que vous aimeriez pouvoir écrire ceci:

List<???> list = new List<???>(); // This line won't work 
list.Add(Method1); 
list.Add(Method2); 

... 

static int Method1() { ... } 
static string Method2() { ... } 

Si j'ai mal compris, et un simple paramètre de type générique de T dans votre méthode ou classe suffit, je vais supprimer cette réponse :)

le plus proche, vous pouvez venir au-dessus serait quelque chose comme ceci:

public class FuncList 
{ 
    private readonly List<Delegate> list = new List<Delegate>(); 

    public void Add<T>(Func<T> func) 
    { 
     list.Add(func); 
    } 
} 

vous aviez alors l'utiliser comme:

FuncList list = new FuncList(); 
list.Add<int>(Method1); 
list.Add<string>(Method2); 

Tout ce que vous auriez faire avec la liste par la suite est difficile ... qu'aviez-vous en tête?

Questions connexes