Ho un metodo genericoPosso limitare il metodo generico a più di una interfaccia?
public static void DoSomething<T>()
{...}
. Ora voglio limitare tale T.
public static void DoSomething<T>() where T: IInterface1
{...}
Ma quello che voglio realmente sta permettendo più interfacce, qualcosa come
public static void DoSomething<T>() where T: IInterface1, IInterface2
{...}
Ma questo non funziona. Compiler dice qualcosa come
There's no implicit conversion from IInterface1 to IInterface2
There's no implicit conversion from IInterface2 to IInterface1
ho pensato di lasciare che le classi implementare un'interfaccia comune che posso fare riferimento, ma non hanno accesso alle classi.
Quali possibilità devo consentire più interfacce?
Grazie, Tobi
Edit: Ecco cosa volevo fare. Sto sviluppando un componente aggiuntivo di Outlook. Io uso questo codice sotto molto spesso.
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;
}
Il metodo GetMapiItem prende un oggetto finché è uno degli elementi di Outlook (Journal, Mail, contatti, ...). Ecco perché stavo limitando T. Perché non può essere, per esempio, Outlook.MAPIFolder.
No ho cambiato il metodo per
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);
}
ma lo sviluppatore (in questo caso I) può dare qualsiasi tipo perché il metodo GetMapiItem accetta un oggetto. Spero che abbia un senso. Non sono sicuro che lo faccia per quell'esempio, ma suppongo che limitare un metodo generico a più tipi (con OR) possa essere una buona idea.
Quale framework si sta targeting e si sta compilando con Visual Studio e quale versione? Ho qui VS 2008 con .NET 3.5 e le compilazioni di cui sopra va bene. Sei sicuro che quello che ci dai come esempio è quello che hai. –
perché in questo modo si dice al compilatore che T dovrebbe essere IInterface1 e IInterface2 not oppure –
il codice che fornisce funziona, ha solo bisogno di dire il metodo per prendere i parametri di tipo IInterface1 O IInterface2 –