Alguém pode explicar o Activator.CreateInstance()
objetivo em detalhes?
c#
.net
reflection
Tabriz Atayi
fonte
fonte
CreateInstance(Type type)
seja combinada com aCreateInstance<T>()
sobrecarga.c#.net
maneira de fazerObject xyz = Class.forName(className).newInstance();
.Respostas:
Digamos que você tenha uma classe chamada
MyFancyObject
como esta abaixo:Permite ativar:
Para dentro
Usando
e pode fazer coisas como:
Esse é o seu propósito. Ele também possui muitas outras sobrecargas, como fornecer um
Type
nome em vez do nome da classe em uma sequência. Por que você teria um problema como esse é uma história diferente. Aqui estão algumas pessoas que precisavam:fonte
String ClassName = "My.Namespace.MyFancyObject";
).obj = (MyFancyObject)Activator.CreateInstance("MyAssembly", ClassName))
mas em vez de transmitir com o tipo Transmitir com o tipo criado a partir do ClassName? Gosta dissoType type = Type.GetType(ClassName);obj = (type )Activator.CreateInstance("MyAssembly", ClassName))
?Bem, eu posso te dar um exemplo de por que usar algo assim. Pense em um jogo em que você deseja armazenar seu nível e inimigos em um arquivo XML. Ao analisar este arquivo, você pode ter um elemento como este.
o que você pode fazer agora é criar dinamicamente os objetos encontrados no seu arquivo de nível.
Isso é muito útil para criar ambientes dinâmicos. É claro que também é possível usar isso para cenários de plug-in ou add-in e muito mais.
fonte
Meu bom amigo MSDN pode explicar isso para você, com um exemplo
Aqui está o código, caso o link ou o conteúdo seja alterado no futuro:
fonte
Você também pode fazer isso -
fonte
.Unwrap()
é preciso e como isso se relaciona com outras soluções?CreateInstance
onde ele retornaSystem.Runtime.Remoting.ObjectHandle
.Um bom exemplo pode ser o próximo: por exemplo, você tem um conjunto de Registradores e permite que o usuário especifique o tipo a ser usado no tempo de execução via arquivo de configuração.
Então:
OU outro caso é quando você tem uma fábrica de entidades comum, que cria uma entidade, e também é responsável na inicialização de uma entidade pelos dados recebidos do DB:
(pseudo-código)
fonte
typeof(loggerType)
resulta emloggerType is a variable and used like a type
O
Activator.CreateInstance
método cria uma instância de um tipo especificado usando o construtor que melhor corresponde aos parâmetros especificados.Por exemplo, digamos que você tenha o nome do tipo como uma sequência e deseja usá-la para criar uma instância desse tipo. Você pode usar
Activator.CreateInstance
para isso:Aqui está um artigo do MSDN que explica sua aplicação com mais detalhes:
http://msdn.microsoft.com/en-us/library/wccyzw83.aspx
fonte
new Foo()
. Eu acho que o OP queria um exemplo mais realista.CreateInstance
é se você não souber o tipo de objeto que você irá instanciar no momento do design. Neste exemplo, você sabe claramente que é do tipo,Foo
uma vez que o está convertendo como tipoFoo
. Você nunca faria isso porque pode simplesmente fazerFoo foo = new Foo()
.Com base no deepee1 e isso , veja como aceitar um nome de classe em uma string e, em seguida, usá-lo para ler e gravar em um banco de dados com LINQ. Eu uso "dinâmico" em vez da conversão do deepee1 porque ele me permite atribuir propriedades, o que nos permite selecionar e operar dinamicamente em qualquer tabela que desejar.
fonte
Por que você o usaria se você já conhecesse a classe e a apresentasse? Por que não fazer da maneira antiga e fazer da classe como você sempre faz? Não há vantagem nisso sobre o modo como é feito normalmente. Existe uma maneira de pegar o texto e operá-lo assim:
Se eu já sei que é uma Pizza, não há vantagem em:
mas vejo uma enorme vantagem no método Magic, se existir.
fonte
Juntamente com a reflexão, achei o Activator.CreateInstance muito útil no mapeamento do resultado do procedimento armazenado para uma classe personalizada, conforme descrito na resposta a seguir .
fonte