120 votes

Appel d'une méthode statique sur un paramètre de type générique

J'espérais faire quelque chose comme ça, mais cela semble 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 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.

68voto

JaredPar Points 333733

Dans ce cas, vous devez simplement appeler directement la méthode statique sur le type contraint. C # (et le CLR) ne supporte pas les méthodes statiques virtuelles. Donc, T.StaticMethodOnSomeBaseClassThatReturnsCollection ne peut pas être différent de SomeBaseClass.StaticMethodOnSomeBaseClassThatReturnsCollection. Passer par le paramètre de type générique est une indirection inutile et n'est donc pas pris en charge.

35voto

Joshua Pech Points 192

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:

public void doSomething<T>() where T : someParent
{
    List<T> items=(List<T>)typeof(T).GetMethod("fetchAll").Invoke(null,new object[]{});
    //do something with items
}

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.

8voto

Marc Gravell Points 482669

La seule façon d'appeler une telle méthode serait par réflexion. Cependant, il semble qu'il soit possible d'envelopper cette fonctionnalité dans une interface et d'utiliser un modèle IoC / factory / etc basé sur une instance.

5voto

Brad Wilson Points 22910

On dirait que vous essayez d'utiliser des génériques pour pallier le fait qu'il n'y a pas de "méthodes statiques virtuelles" en C #.

Malheureusement, ça ne marchera pas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X