L'appel d'une méthode statique sur un paramètre de type générique
J'espérais faire quelque chose comme ça, mais il semble être illégale en C#:
public Collection MethodThatFetchesSomething<T>()
where T : SomeBaseClass
{
return T.StaticMethodOnSomeBaseClassThatReturnsCollection();
}
J'obtiens une erreur de compilation: "'T' est un "type de paramètre", ce qui n'est pas valide dans le contexte donné."
Donné un paramètre de type générique, comment puis-je appeler une méthode statique de la classe générique? La méthode statique doit être disponible, compte tenu de la contrainte.
- Voir blogs.msdn.com/b/ericlippert/archive/2007/06/14/... et blogs.msdn.com/b/ericlippert/archive/2007/06/18/... et blogs.msdn.com/b/ericlippert/archive/2007/06/21/3445650.aspx pour en savoir plus sur ce sujet.
Vous devez vous connecter pour publier un commentaire.
Dans ce cas, vous devez simplement appeler la méthode statique sur les contraintes de type directement. C# (et le CLR) ne prennent pas en charge virtuel des méthodes statiques. Donc:
...peut-être pas différente de celle d':
En passant par le paramètre de type générique est une inutiles indirection et ne sont donc pas pris en charge.
return SomeBaseClass.StaticMethodOnSomeBaseClassThatReturnsCollection();
travail? Si oui, vous voudrez peut-être ajouter que, pour votre réponse. Merci. Il a travaillé pour moi. Dans mon cas, ma classe avait un type de param donc je n'aireturn SomeBaseClass<T>.StaticMethodOnSomeBaseClassThatReturnsCollection();
et que travaillé.Pour élaborer une réponse précédente, je pense que la réflexion est plus proche de ce que vous voulez ici. Je pourrais donner 1001 raisons pour lesquelles vous devriez faire ou ne pas faire quelque chose, je vais juste répondre à votre question, comme l'a demandé. Je pense que vous devriez appeler le GetMethod méthode que sur le type de paramètre générique et aller de là. Par exemple, pour une fonction:
Où T est toute la classe qui a la statique de la méthode fetchAll().
Oui, je suis conscient que c'est terrifiant lente et peut se bloquer si someParent ne pas forcer tous les de son enfant des classes pour mettre en œuvre fetchAll mais il répond à la question posée.
Le seul moyen de l'appel d'une telle méthode serait par la réflexion, Cependant, il sonne comme il pourrait être possible d'encapsuler ces fonctionnalités dans une interface et l'utilisation d'une fonction d'instance du Cio /usine /etc modèle.
Il semble que vous essayez d'utiliser des génériques pour contourner le fait qu'il n'existe pas de "virtuel méthodes statiques" en C#.
Malheureusement, cela ne marchera pas.
Comme de maintenant, vous ne pouvez pas. Vous avez besoin d'une manière de dire au compilateur que T a la méthode, et actuellement, il n'y a pas moyen de le faire. (Beaucoup sont en train de pousser Microsoft à développer ce qui peut être spécifié dans une contrainte générique, peut-être que ce sera possible dans le futur).
Ici, je poste un exemple de ce travail, il est une solution de contournement
public T : SomeBaseClass
veux dire?Je voulais juste jeter là-bas que, parfois, les délégués de résoudre ces problèmes, selon le contexte.
Si vous devez appeler la méthode statique comme une sorte d'une usine ou d'une méthode d'initialisation, vous pouvez déclarer un délégué et de passer à la méthode statique à la générique usine ou quoi que ce soit qui a besoin de cette "classe générique avec cette méthode statique".
Par exemple:
Malheureusement, vous ne pouvez pas appliquer que la classe a la bonne méthode, mais vous pouvez au moins au moment de la compilation-appliquer que la méthode de fabrique a tout ce qu'il attend (j'.e une méthode d'initialisation avec exactement le droit de signature). C'est mieux qu'un moment de l'exécution de réflexion exception.
Cette approche a aussi quelques avantages, je.e vous pouvez réutiliser les méthodes init, demandez-leur d'être des méthodes d'instance, etc.
Vous devriez être en mesure de le faire à l'aide de la réflexion, comme il est décrit ici