2016-11-08 8 views
0

Supposons que j'ai le code suivant:Une façon d'avoir des paramètres de type déduits des autres contraintes de paramètres de type en C#?

interface IWidget 
{ 
} 

interface IWidgetFactory<TWidget> 
    where TWidget : IWidget 
{ 
} 

TWidgetFactory CreateFactory<TWidgetFactory, TWidget>() 
    where TWidgetFactory : IWidgetFactory<TWidget> 
    where TWidget : IWidget 
{ 
    return ... 
} 

Chaque fois que j'appelle CreateFactory() je dois passer dans les deux paramètres de type TWidgetFactory et Twidget. Cela semble inutile, car TWidgetFactory a déjà une contrainte telle que toute spécialisation de celui-ci doit déjà spécifier TWidget. Y a-t-il un moyen de déduire automatiquement TWidget lorsque j'appelle CreateFactory(), même si je dois ajouter des méthodes d'assistance supplémentaires?

(Ce qui précède est un exemple simple, mais il peut être bien plus compliquée dans la pratique, donc cela pourrait économiser beaucoup de complexité.)

+0

Dans 'CreateFactory', avez-vous réellement besoin d'appeler une méthode dans' 'IWidgetFactory dont la signature contient un' TWidget'? –

+0

Merci pour la réponse, j'utilise ce modèle où je n'ai pas besoin du type de TWidget. Si je l'utilise dans la méthode, cependant, y a-t-il un moyen de le déduire sans le transmettre explicitement? – EM0

+0

Non, pas à ma connaissance. Les génériques manquent de la flexibilité requise pour le faire. –

Répondre

2

Sans voir le corps de CreateFactory, il est difficile de dire ce que vous Faisons. Basé sur le type de retour, je soupçonne que CreateFactory n'utilise pas réellement TWidget pour n'importe quoi mais comme le paramètre de type à l'interface. Dans ce cas, pourriez-vous relâcher un peu vos contraintes génériques?

interface IWidget 
{ 
} 

interface IWidgetFactory {} // A new non-generic base interface 

interface IWidgetFactory<TWidget> : IWidgetFactory 
    where TWidget : IWidget 
{ 
} 

// Generic constraints wind up not as specific, 
// but still provide some level of restriction 
// TWidget can no longer be used within this method. 
TWidgetFactory CreateFactory<TWidgetFactory>() 
    where TWidgetFactory : IWidgetFactory 
{ 
    return ... 
}