Você pode ver o que estou tentando (mas falhando) com o seguinte código:
protected T GetObject()
{
return new T();
}
Qualquer ajuda seria muito apreciada.
EDITAR:
O contexto foi o seguinte. Eu estava brincando com uma classe de controlador personalizada para a qual todos os controladores derivam, com métodos padronizados. Portanto, no contexto, eu precisava criar uma nova instância do objeto do tipo de controlador. Então, no momento da escrita, era algo como:
public class GenericController<T> : Controller
{
...
protected T GetObject()
{
return (T)Activator.CreateInstance(ObjectType);
}
public ActionResult Create()
{
var obj = GetObject()
return View(obj);
}
E então eu decidi que a reflexão era mais fácil aqui. Concordo que, certamente, dada a afirmação inicial da pergunta, a resposta mais apropriada para marcar como correta foi a que estava usando a nova restrição (). Eu consertei isso.
Respostas:
Dê uma olhada no novo Constraint
T
poderia ser uma classe que não possui um construtor padrão: nesse caso,new T()
seria uma instrução inválida. Anew()
restrição diz queT
deve ter um construtor padrão, o que tornanew T()
legal.Você pode aplicar a mesma restrição a um método genérico:
Se você precisar passar parâmetros:
fonte
Por que ninguém sugeriu
Activator.CreateInstance
?http://msdn.microsoft.com/en-us/library/wccyzw83.aspx
fonte
Outra maneira é usar a reflexão:
fonte
Apenas para conclusão, a melhor solução aqui é geralmente exigir um argumento de função de fábrica:
e chame de algo assim:
Você pode usar isso para exigir ou usar os parâmetros disponíveis, se necessário.
fonte
A nova restrição é boa, mas se você também precisar de um tipo de valor T, use este:
fonte
Como esse código está marcado como C # 4. Com a estrutura de código-fonte aberto ImpromptuIntereface, ele usará o dlr para chamar o construtor. É significativamente mais rápido que o Activator quando o construtor tem argumentos, e notavelmente mais lento quando não. No entanto, a principal vantagem é que ele manipulará os construtores com parâmetros opcionais do C # 4.0 corretamente, algo que o Activator não fará.
fonte
Para obter isso, tentei o seguinte código:
fonte