J'espérais faire quelque chose comme ça, mais cela semble être illégal en C #:
public Collection MethodThatFetchesSomething<T>()
where T : SomeBaseClass
{
return T.StaticMethodOnSomeBaseClassThatReturnsCollection();
}
J'obtiens une erreur de compilation: "" T "est un" paramètre de type ", qui n'est pas valide dans le contexte donné."
Étant donné un paramètre de type générique, comment puis-je appeler une méthode statique sur la classe générique? La méthode statique doit être disponible, compte tenu de la contrainte.
Réponses:
Dans ce cas, vous devez simplement appeler la méthode statique directement sur le type contraint. C # (et le CLR) ne prennent pas en charge les méthodes statiques virtuelles. Alors:
... ne peut être différent de:
Passer par le paramètre de type générique est une indirection inutile et n'est donc pas prise en charge.
la source
return SomeBaseClass.StaticMethodOnSomeBaseClassThatReturnsCollection();
travailler? Si tel est le cas, vous voudrez peut-être ajouter cela à votre réponse. Merci. Cela a fonctionné pour moi. Dans mon cas, ma classe avait un paramètre de type alors je l'ai faitreturn SomeBaseClass<T>.StaticMethodOnSomeBaseClassThatReturnsCollection();
et cela a fonctionné.Pour développer 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 ou ne devriez pas faire quelque chose, je répondrai simplement à votre question telle que vous l'avez posée. Je pense que vous devriez appeler la méthode GetMethod sur le type du paramètre générique et partir de là. Par exemple, pour une fonction:
Où T est une classe qui a la méthode statique fetchAll ().
Oui, je suis conscient que cela est horriblement lent et peut planter si someParent ne force pas toutes ses classes enfants à implémenter fetchAll mais il répond à la question comme demandé.
la source
La seule façon d'appeler une telle méthode serait par réflexion. Cependant, il semble qu'il soit possible d'encapsuler cette fonctionnalité dans une interface et d'utiliser un modèle IoC / factory / etc basé sur une instance.
la source
Il semble que vous essayez d'utiliser des génériques pour contourner le fait qu'il n'y a pas de «méthodes statiques virtuelles» en C #.
Malheureusement, cela ne fonctionnera pas.
la source
A partir de maintenant, vous ne pouvez pas. Vous avez besoin d'un moyen de dire au compilateur que T a cette méthode, et actuellement, il n'y a aucun moyen de le faire. (Beaucoup poussent Microsoft à étendre ce qui peut être spécifié dans une contrainte générique, donc peut-être que cela sera possible à l'avenir).
la source
Ici, je poste un exemple qui fonctionne, c'est une solution de contournement
la source
public T : SomeBaseClass
dire?Je voulais juste dire que parfois les délégués résolvent ces problèmes, selon le contexte.
Si vous devez appeler la méthode statique comme une sorte de fabrique ou de méthode d'initialisation, vous pouvez déclarer un délégué et passer la méthode statique à la fabrique générique appropriée ou à tout ce qui a besoin de cette "classe générique avec cette méthode statique".
Par exemple:
Malheureusement, vous ne pouvez pas garantir que la classe a la bonne méthode, mais vous pouvez au moins faire en sorte que la méthode de fabrique résultante ait tout ce qu'elle attend (c'est-à-dire une méthode d'initialisation avec exactement la bonne signature). C'est mieux qu'une exception de réflexion d'exécution.
Cette approche présente également certains avantages, c'est-à-dire que vous pouvez réutiliser les méthodes d'initialisation, les utiliser comme méthodes d'instance, etc.
la source
Vous devriez pouvoir le faire en utilisant la réflexion, comme décrit iciEn raison du lien mort, j'ai trouvé les détails pertinents dans la machine de retour:
la source