2012-01-25 2 views
0

У меня есть метод, который принимает параметр Generic. Я ограничил тип одним из двух. Внутри метода я хочу установить вызов одного из двух конструкторов.Установить Generic для нового экземпляра в C#

Код:

internal static void CreateAddress<T>(out T address, bool isSave, int? cID) where T: Address_Accessor, Address 
{ 
    DateTime dt= DateTime.Now; 
    int? eID = 1; 
    int? sID = 50; 

    if (typeof(T) == typeof(Address_Accessor)) 
    address = new Address_Accessor(dt, eID , sID); 
    else 
    address = new Address(dt, eID, sID); 
} 

Провал компиляции говорит:

Не может неявно преобразовать тип 'Address_Accessor' до 'Т'. Явное преобразование существует (вы пропали без вести броска?)

+3

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

+0

Какова связь между Address_Accessor и адресом? –

+0

Это не правильно, generics позволяют работать с определенными типами, а не просто динамически смешивать и сопоставлять типы. –

ответ

1

В качестве непосредственного решения (не имея какие-либо подробности regardign метода случаев использования) , если адрес и Address_Accessor и представляют некоторую общую сущность - просто ввести общий интерфейс и ограничение T для реализации этого интерфейса, тогда вы сможете инсталировать любой класс, который реализует IAddress и устанавливает ссылку IAddress (за T).

interface IAddress 
{ 
} 

class Address_Accessor : IAddress 
class Address : IAddress 

internal static void CreateAddress<T>(out T address, bool isSave, int? cID) 
where T: IAddress 
{ 
} 

Я чувствую, что некоторые вопросы проектирования вокруг, не могли бы вы опубликовать код, призывающую CreateAddress() метода как Address и Address_accessor случаев? Возможно, вы ищете какую-то абстрактную фабрику?

+2

Еще лучше, забудьте общий тип и просто используйте IAddress вместо T. –

+0

Это предполагает соответствующую ссылку между двумя типами в форме, видимой только для одного из них ('Address'), если для этого используется' IAddress' цель - это плохая привычка. –

1

Я не понимаю, почему вам нужен, что код, но вы не можете преобразовать объекты результатов Т до возвращения документов:

object result = typeof(T) == typeof(Address_Accessor) 
    ? (object) new Address_Accessor(dt, eID , sID) 
    : (object) new Address(dt, eID, sID); 

address = (T)result; 
+0

Назначение обработано, но ошибка во втором: адрес = (T) новый адрес (dt, eID, sID); Я думаю, что могу просто использовать: адрес = (T) new Address_Accessor (dt, eID, sID); без инструкции if. – Josh

+0

Другая версия здесь, но вы должны подумать об изменениях иерархии типов, чтобы решить эту проблему. Мой код круглый. –

+0

Другая ошибка: тип условного выражения не может быть определен, потому что нет никакого неявного преобразования между 'Address_Accessor' и 'Address' - я собираюсь попробовать другой подход для этого кода. Благодарю. – Josh

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