Je ne suis pas sûr de comprendre ce que vous essayez d'accomplir. Je vais essayer de deviner.
Si vous savez que la quantité nécessaire des paramètres de type ne dépassera jamais quatre, vous pouvez simplement faire un tableau
Type[] types = new Type[] { typeof(Action<>), typeof(Action<,>), typeof(Action<,,>) }; // omitted the rest
et fournir une fonction
int CalculateNumberOfParameters(int i)
{
// I don't know what your i variable really means, but I suggest you have some method to determine a number of type parameters from it).
}
Ensuite, vous utilisez simplement les types [CalculateNumberOfParameters (i)] pour obtenir votre type d'action. Notez que j'ai fourni un tableau de génériques non paramétrés, donc vous devriez appeler MakeGenericType() pour créer un type instantiable réel. Si vous connaissez au préalable vos paramètres génériques (et qu'ils ne dépendent pas de i), vous devez les spécifier lors de la création du type de tableau.
Si vous ne pouvez jamais connaître la quantité de paramètres génériques dont vous aurez besoin, vous devrez créer des types lors de l'exécution, car .net ne définit que l'action avec les paramètres 0-4. Vous devrez toujours fournir une conversion (ou un adaptateur) à l'un des types standard, de sorte que les instances de votre type créé peuvent réellement être utilisables à partir d'une autre partie de votre application. C'est une route difficile, et je n'ai dû l'utiliser qu'une seule fois (pour la sérialisation de l'expression linq), donc je ne vais pas entrer dans les détails à moins d'une question spécifique.
Eh bien, si vous ne pouvez pas utiliser l'interrupteur juste parce que l'interrupteur ne fonctionne que sur les constantes que vous pouvez envisager d'utiliser un si bloc autre et typeof (Action <>) –
Eh bien, votre vrai problème est que vous ne pouvez pas créer une action sans connaître le type de T1. Alors connaissez-vous les paramètres de type pour chaque cas? –
driis
Il ne souhaite pas créer une instance de l'action, uniquement l'objet type correspondant. –