2016-06-01 4 views
1

У меня есть 2 типа объектов, модели баз данных и обычные системные модели.Общий конструктор с ограничениями нового типа

Я хочу, чтобы учесть модель модели в модели базы данных и наоборот.

У меня есть следующий метод, который я написал:

public static E FromModel<T, E>(T other) 
      where T : sysModel 
      where E : dbModel 
{ 
    return new E(other); 
} 

в основном как sysModel и dbModel являются абстрактными.

В dbModel есть много классов наследования, у которых есть все конструкторы копирования.

Im получение:

Невозможно создать экземпляр параметра «Е» типа becauase это не есть новый() ограничение

Im осведомленный, что технически иногда я не имею соответствия конструктор для каждого значения T, по крайней мере, что знает отладчик.

Я также попытался добавить ограничение where E : dbModel, new(), но его просто не имеет значения.

Есть ли способ конвертировать модель в другую модель с использованием общего метода и с использованием параметров?

Спасибо.

+0

Параметр 'новый()' ограничение для задания типа имеет конструктор без параметров. Вероятно, вам нужно ввести какой-то общий заводский метод через интерфейс, который предоставляет тип конструкции копирования, которую вы хотите. – Anthony

+0

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

+1

Вы не можете навязывать существование конструктора с параметрами при аргументах общего типа. Вы останетесь с помощью 'Activator.CreateInstance', чтобы сделать это и молитесь, чтобы используемые типы имели соответствующий конструктор. Как правило, решения, использующие общие типы, должны воздерживаться от такого рода вещей, потому что вы навязываете жесткую зависимость от реализации. Это похоже на высказывание «Я хочу, чтобы этот метод мог построить любой тип класса хранения, * ANY TYPE *, но он должен иметь строковый параметр в конструкторе, и он должен быть именем файла». –

ответ

3

Чтобы использовать new на родового типа, вы должны указать new() ограничение на ваш класс/метод определения:

public static E FromModel<T, E>(T other) 
     where T : sysModel 
     where E : dbModel, new() 

Поскольку вы используете параметр в конструкторе, вы не можете использовать new , но вы можете использовать Activator вместо и передать other в качестве аргумента:

public static E FromModel<T, E>(T other) 
    where T : sysModel 
    where E : dbModel 
{ 
    return (E)Activator.CreateInstance(typeof(E), new[]{other}); 
} 
+0

, похоже, компилируется. что бы это случилось? похоже, что любое исключение может быть выброшено. Я понимаю, что он должен найти подходящий конструктор, который использует T, правильно? –

+0

Точно. Если 'E' не имеет конструктора, который принимает единственный параметр' T', то он выдает исключение. –

+0

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

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