2010-05-18 8 views
0

Я пытаюсь сделать это:производный интерфейс от общего метода

public interface IVirtualInterface{ } 

public interface IFabricationInfo : IVirtualInterface 
{ 
    int Type { get; set; } 
    int Requirement { get; set; } 
} 

public interface ICoatingInfo : IVirtualInterface 
{ 
    int Type { get; set; } 
    int Requirement { get; set; } 
} 


public class FabInfo : IFabricationInfo 
{ 

    public int Requirement 
    { 
     get { return 1; } 
     set { } 
    } 

    public int Type 
    { 
     get {return 1;} 
     set{} 
    } 
} 

public class CoatInfo : ICoatingInfo 
{ 
    public int Type 
    { 
     get { return 1; } 
     set { } 
    } 
    public int Requirement 
    { 
     get { return 1; } 
     set { } 
    } 
} 

public class BusinessObj 
{ 
    public T VirtualInterface<T>() where T : IVirtualInterface 
    { 
     Type targetInterface = typeof(T); 
     if (targetInterface.IsAssignableFrom(typeof(IFabricationInfo))) 
     { 
      var oFI = new FabInfo(); 
      return (T)oFI; 
     } 

     if (targetInterface.IsAssignableFrom(typeof(ICoatingInfo))) 
     { 
      var oCI = new CoatInfo(); 
      return (T)oCI; 
     } 
     return default(T); 
    } 
} 

Но получаю ошибку компилятора: Canot преобразовать тип «GenericIntf.FabInfo» Т

Как это исправить?

благодаря Sunit

ответ

0

Вы можете обойти эту ошибку с помощью первого литья до object перед литьем к T e.g.

return (T)(object)oFI;

и аналогично для CoatInfo

Однако я думаю, что переключение на общего типа является нарушением, так как если вы хотите ограниченное число возможных возвращаемых значений, можно сделать параметры явным, например,

public IFabricationInfo GetFabricationInfo() 
{ 
    return new FabInfo(); 
} 
1

Тот факт, что T и FabInfo как реализовать IVirtualInterface не означает, что вы можете выполнить бросок между этими двумя типами. Например, если T - CoatInfo, то он несовместим с FabInfo.

Интерфейсы позволяют обрабатывать разные объекты как похожие типы на основе методов, которые они предоставляют. Однако это не означает, что вы можете выполнять отбрасывания между этими двумя типами, поскольку их фактическая реализация может сильно различаться.

Редактировать: После повторного чтения вашего метода, я вижу, что вы сначала проверяете тип. Проблема заключается в том, что компилятор не знает, что вы выполняете эту логику, прежде чем пытаться сделать это. Если вы пишете общий метод и проверяете тип T, вы, вероятно, злоупотребляете концепцией дженериков. См. Другие ответы о том, как вы должны создавать новые экземпляры T.

4

Предполагая, что все реализации IVirtualInterface будет иметь конструктор по умолчанию (как в вашем примере), вы можете сделать это вместо:

public T VirtualInterface<T>() where T : IVirtualInterface, new() 
{ 
    return new T(); 
} 

Simples!

EDIT:

Именно то, что вы пытаетесь достичь трудно определить из кода вы публикуемые. Почему нет VirtualInterface static (подразумевает, что все бизнес-объекты наследуют этот метод, который кажется нечетным)? Если вам нужно иметь возможность параметризованных конструкторов для реализаций в исполнении IVirtualInterface, откуда берутся эти значения параметров (вы не передаете какой-либо метод VirtualInterface)?

Если вы просто хотите, чтобы избежать загромождения IntelliSense (плохая причина для пытаться что-то вроде этого ИМХО) но и хотят сохранить поддержку parameteried конструкторах, то как об этом:

public T VirtualInterface<T>(Func<T> constructor) where T : IVirtualInterface 
{ 
    return constructor(); 
} 

С использованием:

IFabricationInfo fabInfo = 
    new BusinessObj().VirtualInterface<IFabricationInfo>(() => new FabInfo()); 

В целом, хотя и без достаточной информации, чтобы сделать суровое суждение, я должен был бы сказать, что это smells.

+0

Спасибо .. но это ограничило бы тип реализации. Я хочу ограничить интерфейс и вернуть его. ответить, Ли, я не использую экспрессивные публичные методы, так как я не хочу иметь n таких методов, как GetFabricationInfo(), GetConstructionInfo() и т. д., которые заполнят Intellisense. – Sunit

+0

Я расширил свой ответ –

Смежные вопросы