2010-02-17 22 views
7

He creado este método, que es una factoría de objetos:Creación método genérico y el uso de parámetro de tipo

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); 
} 

Ahora, me gustaría ir más allá y eliminar la necesidad de parámetro "ServiceInterface", pero mi problema es - no sé cómo comparar parámetro de tipo T a una interfaz: hacer

T.Equals(typeof(ILookupService)) 

da error del compilador: 'T' es un 'parámetro de tipo', que no es válida en el contexto dado.

¿Alguna idea de cómo podría comparar un parámetro de tipo a una interfaz?

Gracias, Andrey

+0

Usted puede escoger el valor de la variable de ServiceInterface como este -> https://stackoverflow.com/a/44114122/1580548 – ddagsan

Respuesta

7

Puede utilizar typeof(T) para obtener una copia de Type objeto que podría reemplazar el uso de serviceInterface

Por ejemplo

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

Maldición, ahora me da vergüenza! ¡Tan simple! ¡Muchas gracias, Jared! – Andrey

+0

Claro, pero ¿igualará alguna vez una interfaz? Si T representa el tipo de un objeto concreto, seguramente no será igual a una interfaz. – spender

+0

@spender, el método GetService también se puede invocar con una interfaz. Por ejemplo GetService (); – JaredPar

1

Uso typeof(T).

Así,

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

podría ser aplicable al operador is aquí?

+0

'is' se aplica a * objects * not * classes *, entonces no, wouldn No le proporcione al OP una solución. Podría tal vez ser utilizado en su diseño original, pero no al eliminar el parámetro. – jv42

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

Combina esta respuesta ('IsAssignableFrom') con la respuesta de JaredPar, y tendrás la solución completa. – fre0n

+0

¿Qué pasa con mi solución original? Necesito saber si el tipo pasado coincide exactamente con la interfaz que comparo con – Andrey

Cuestiones relacionadas