Tengo un método genérico¿Puedo restringir el método genérico a más de una interfaz?
public static void DoSomething<T>()
{...}
. Ahora quiero para restringir que T.
public static void DoSomething<T>() where T: IInterface1
{...}
Pero lo que realmente quiero es que permite múltiples interfaces, algo así como
public static void DoSomething<T>() where T: IInterface1, IInterface2
{...}
Pero eso no funciona. Compilador dice algo así como
There's no implicit conversion from IInterface1 to IInterface2
There's no implicit conversion from IInterface2 to IInterface1
pensé en dejar que las clases de implementar una interfaz común que puedo hacer referencia a pero no tienen acceso a las clases.
¿Qué posibilidades tengo de permitir múltiples interfaces?
Gracias, Tobi
Editar: Esto es lo que quería hacer. Estoy desarrollando un Outlook-Add-In. Utilizo este fragmento de código a continuación bastante a menudo.
public static object GetItemMAPIProperty<T>(AddinExpress.MAPI.ADXMAPIStoreAccessor adxmapiStoreAccessor, object outlookItem, uint property) where T: Outlook.MailItem, Outlook.JournalItem
{
AddinExpress.MAPI.MapiItem mapiItem;
mapiItem = adxmapiStoreAccessor.GetMapiItem(((T)outlookItem));
return mapiItem != null ? mapiItem.GetProperty(property) : null;
}
El método GetMapiItem toma un objeto con tal de que uno de los elementos de Outlook (Diario, Mail, contactos, ...). Es por eso que estaba restringiendo a T. Porque no puede ser, por ejemplo, Outlook.MAPIFolder.
No he cambiado el método para
public static object GetItemMAPIProperty<T>(AddinExpress.MAPI.ADXMAPIStoreAccessor adxmapiStoreAccessor, T outlookItem, uint property)
{
AddinExpress.MAPI.MapiItem mapiItem;
mapiItem = adxmapiStoreAccessor.GetMapiItem(((T)outlookItem));
return mapiItem.GetProperty(property);
}
pero el desarrollador (En este caso yo) puede darle cualquier tipo porque el método GetMapiItem acepta un objeto. Espero que tenga sentido. No estoy seguro de que sirva para ese ejemplo, pero supongo que restringir un método genérico a varios tipos (con O) puede ser una buena idea.
¿A qué marco se dirige, y está compilando con Visual Studio, y qué versión? Tengo aquí VS 2008 con .NET 3.5 y lo anterior compila muy bien. ¿Estás seguro de que lo que nos estás dando como ejemplo es lo que tienes? –
porque de esa manera usted dice que el compilador que T debe ser IInterface1 e IInterface2 not o –
el código que proporciona funciona, solo necesita decir el método para tomar el parámetro de tipo IInterface1 O IInterface2 –