Tome a seguinte aula como exemplo:
class Sometype
{
int someValue;
public Sometype(int someValue)
{
this.someValue = someValue;
}
}
Em seguida, quero criar uma instância desse tipo usando reflexão:
Type t = typeof(Sometype);
object o = Activator.CreateInstance(t);
Normalmente, isso funcionará, no entanto, como SomeType
não definiu um construtor sem parâmetros, a chamada para Activator.CreateInstance
lançará uma exceção do tipo MissingMethodException
com a mensagem " Nenhum construtor sem parâmetros definido para este objeto. " Existe uma maneira alternativa de ainda criar uma instância desse tipo? Seria meio chato adicionar construtores sem parâmetros a todas as minhas classes.
FormatterServices.GetUninitializedObject
não permite a criação de strings não inicializadas. Você pode obter uma exceção:System.ArgumentException: Uninitialized Strings cannot be created.
tenha isso em mente.Respostas:
Originalmente, postei esta resposta aqui , mas aqui está uma reimpressão, pois esta não é exatamente a mesma pergunta, mas tem a mesma resposta:
FormatterServices.GetUninitializedObject()
criará uma instância sem chamar um construtor. Eu encontrei essa classe usando o Reflector e vasculhando algumas das principais classes de serialização .Net.Eu testei usando o código de amostra abaixo e parece que funciona muito bem:
fonte
Use esta sobrecarga do método CreateInstance:
Consulte: http://msdn.microsoft.com/en-us/library/wcxyzt4d.aspx
fonte
Quando fiz o benchmarking, o desempenho
(T)FormatterServices.GetUninitializedObject(typeof(T))
foi mais lento. Ao mesmo tempo, as expressões compiladas proporcionariam grandes melhorias de velocidade, embora funcionem apenas para tipos com construtor padrão. Adotei uma abordagem híbrida:Isso significa que a expressão de criação é efetivamente armazenada em cache e incorre em penalidades apenas na primeira vez que o tipo é carregado. Também lidará com tipos de valor de maneira eficiente.
Chame-o:
Observe que
(T)FormatterServices.GetUninitializedObject(t)
falhará para string. Conseqüentemente, o tratamento especial para string está disponível para retornar uma string vazia.fonte
Boas respostas, mas inutilizáveis na estrutura compacta dot net. Aqui está uma solução que funcionará na CF.Net ...
fonte