2010-02-17 3 views
7

J'ai créé cette méthode qui est une usine d'objet:Création méthode générique et en utilisant le paramètre de type

public static T GetService<T>(T serviceInterface) 
{ 
    if (serviceInterface.Equals(typeof(IMemberService))) 
    { 
     return (T)(object)new MemberService(); 
    } 
    else if (serviceInterface.Equals(typeof(ILookupService))) 
    { 
     return (T)(object)new LookupService(); 
    } 
    throw new ArgumentOutOfRangeException("No action is defined for service interface " + serviceInterface.Name); 
} 

Maintenant, je voudrais aller plus loin et éliminer le besoin de paramètre « serviceInterface », mais mon problème est - Je ne sais pas comment comparer les paramètres de type T à une interface: faire

T.Equals(typeof(ILookupService)) 

donne erreur du compilateur: « T » est un « paramètre de type », qui est pas valable dans le contexte donné.

Des idées comment pourrais-je comparer un paramètre de type à une interface?

Merci, Andrey

+0

Vous pouvez choisir la valeur de la variable serviceInterface comme ceci -> https://stackoverflow.com/a/44114122/1580548 – ddagsan

Répondre

7

Vous pouvez utiliser typeof(T) pour obtenir un retour d'objet Type qui pourrait remplacer l'utilisation de serviceInterface

Par exemple

public static T GetService<T>() 
{ 
    Type serviceInterface = typeof(T); 
    if (serviceInterface.Equals(typeof(IMemberService))) 
    { 
     return (T)(object)new MemberService(); 
    } 
    else if (serviceInterface.Equals(typeof(ILookupService))) 
    { 
     return (T)(object)new LookupService(); 
    } 
    throw new ArgumentOutOfRangeException("No action is defined for service interface " + serviceInterface.Name); 
} 
+0

Merde, maintenant je suis gêné! Soooo simple! Merci beaucoup! Jared! – Andrey

+0

Bien sûr, mais sera-t-il égal à une interface? Si T représente le type d'un objet concret, il ne sera sûrement pas égal à une interface. – spender

+0

@spender, La méthode GetService peut tout aussi bien être invoquée avec une interface. Par exemple GetService (); – JaredPar

1

Utilisez typeof(T).

Ainsi,

typeof(T).Equals(typeof(ILookupService)) 
0

pourrait l'opérateur is applicable ici?

+0

'is' s'applique aux * objets * pas * classes *, donc non, il wouldn Ne fournissez pas l'OP avec une solution. Il pourrait peut-être être utilisé dans sa conception originale, mais pas lors de la suppression du paramètre. – jv42

1
if (typeof(IMemberService).IsAssignableFrom(typeof(T))) 
{} 
else if (typeof(ILookupService).IsAssignableFrom(typeof(T))) 
{} 
+0

Combinez cette réponse ('IsAssignableFrom') avec la réponse de JaredPar, et vous aurez la solution complète. – fre0n

+0

Quel est le problème avec ma solution d'origine? J'ai besoin de savoir si le type transmis correspond exactement à l'interface que je compare à – Andrey

Questions connexes