Вы можете увидеть, что я пытаюсь (но не могу) сделать с помощью следующего кода:
protected T GetObject()
{
return new T();
}
Любая помощь будет принята с благодарностью.
РЕДАКТИРОВАТЬ:
Контекст был следующим. Я играл с пользовательским классом контроллеров для всех контроллеров, используя стандартизированные методы. Поэтому в контексте мне нужно было создать новый экземпляр объекта типа контроллера. На момент написания статьи это было что-то вроде:
public class GenericController<T> : Controller
{
...
protected T GetObject()
{
return (T)Activator.CreateInstance(ObjectType);
}
public ActionResult Create()
{
var obj = GetObject()
return View(obj);
}
И поэтому я решил, что размышление здесь легче всего. Я согласен с тем, что, безусловно, с учетом первоначального изложения вопроса, наиболее подходящим ответом, помеченным как правильный, был ответ, использующий ограничение new (). Я исправил это.
Ответы:
Посмотрите на новые ограничения
T
может быть классом, который не имеет конструктора по умолчанию: в этом случаеnew T()
будет недопустимый оператор.new()
Ограничение говорит , чтоT
должен иметь конструктор по умолчанию, что делаетnew T()
легальными.Вы можете применить то же ограничение к универсальному методу:
Если вам нужно передать параметры:
источник
Почему никто не предложил
Activator.CreateInstance
?http://msdn.microsoft.com/en-us/library/wccyzw83.aspx
источник
Другой способ заключается в использовании отражения:
источник
Просто для завершения, лучшее решение здесь часто требует аргумента фабричной функции:
и назовите это как-то так:
Вы можете использовать это, чтобы требовать или использовать доступные параметры, если это необходимо.
источник
Новое ограничение в порядке, но если вам нужно T быть типом значения тоже, используйте:
источник
Поскольку он помечен как C # 4. С открытой структурой sourece ImpromptuIntereface он будет использовать dlr для вызова конструктора, он значительно быстрее, чем Activator, когда у вашего конструктора есть аргументы, и незначительно медленнее, когда его нет. Однако главное преимущество заключается в том, что он будет правильно обрабатывать конструкторы с необязательными параметрами C # 4.0, чего не сделает Activator.
источник
Чтобы получить это, я попробовал следующий код:
источник