mam metoda rodzajowaCzy mogę ograniczyć metodę ogólną do więcej niż jednego interfejsu?
public static void DoSomething<T>()
{...}
. Teraz chcę ograniczać że T.
public static void DoSomething<T>() where T: IInterface1
{...}
Ale to, co naprawdę chcę jest umożliwienie wielu interfejsów, coś
public static void DoSomething<T>() where T: IInterface1, IInterface2
{...}
Ale to nie działa. Kompilator mówi coś
There's no implicit conversion from IInterface1 to IInterface2
There's no implicit conversion from IInterface2 to IInterface1
myślałem o pozwalając klas wdrożyć wspólny interfejs, który można odnieść do ale nie mam dostępu do tych klas.
Jakie możliwości mam dla wielu interfejsów?
Dzięki, Tobi
Edit: Oto, co chciałem zrobić. Opracowuję dodatek do programu Outlook. Często używam tego fragmentu kodu.
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;
}
Sposób GetMapiItem przyjmuje obiekt tak długo, jak jest to jeden z elementów programu Outlook (Journal, poczta, kontakt, ...). Właśnie dlatego ograniczałem T. Ponieważ nie może być, powiedzmy, Outlook.MAPIFolder.
Nie zmieniłem metodę
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);
}
ale deweloper (w tym przypadku) może dać każdy typ ponieważ metoda GetMapiItem akceptuje obiekt. Mam nadzieję, że ma to sens. Nie jestem pewien, czy robi to dla tego przykładu, ale myślę, że ograniczenie ogólnej metody do wielu typów (z OR) może być dobrym pomysłem.
Jakie ramy są kierowane i czy kompilujesz je za pomocą Visual Studio, a którą wersję? Mam tutaj VS 2008 z .NET 3.5 i powyższe kompiluje się dobrze. Czy jesteś pewien, że to, co dajesz, jest przykładem. –
ponieważ w ten sposób mówisz kompilator, że T powinno być IInterface1 i IInterface2 nie lub –
kod, który on dostarcza działa, on po prostu trzeba powiedzieć, aby przyjąć parametr typu IInterface1 LUB IInterface2 –