У меня есть общий метод
public static void DoSomething<T>()
{...}
. Теперь я хочу ограничить этот T.
public static void DoSomething<T>() where T: IInterface1
{...}
Но то, что я действительно хочу, это разрешить несколько интерфейсов, что-то вроде
public static void DoSomething<T>() where T: IInterface1, IInterface2
{...}
Но это не работает. Компилятор говорит что-то вроде
Нет неявного преобразования из IInterface1 в IInterface2
Нет неявного преобразования из IInterface2 в IInterface1.
Я подумал о том, чтобы позволить классам реализовать общий интерфейс, на который я могу ссылаться, но у меня нет доступа к классам.
Какие возможности у меня есть, чтобы разрешить несколько интерфейсов?
Спасибо, Тоби
Изменить: вот что я хотел сделать. Я разрабатываю надстройку Outlook. Я использую этот фрагмент кода довольно часто.
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;
}
Метод GetMapiItem принимает объект, если он является одним из элементов Outlook (Журнал, Почта, Контакты,...). Вот почему я ограничивал T. Потому что это не может быть, скажем, Outlook.MAPIFolder.
Нет, я изменил метод на
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);
}
но разработчик (в данном случае я) может присвоить ему любой тип, потому что метод GetMapiItem принимает объект. Я надеюсь, что в этом есть смысл. Я не уверен, подходит ли это для этого примера, но я думаю, что ограничение универсального метода несколькими типами (с ИЛИ) может быть хорошей идеей.
item
, который поддерживает ОБА интерфейса. 28.07.2009