Inquiridor
Instanciar Objeto via Reflection

Pergunta
-
Estou tentando usar o Activator.CreateInstanceFrom para instanciar um objeto do .NET pelo nome.
Isso é essencial pro projeto da minha classe, já que não declaro variáveis, mas apenas instancio objetos específicos , dependendo de alguns parâmetros informados.
Detalhe, no trecho em questão, quero instanciar um "SqlServerCe.SqlCeConnection".
Quando eu abro o Assembly e tento instanciar o objeto que quero, ocorre o seguinte erro :
Meu código é :
(...) Dim Types As Type() = MyAssembly.GetTypes Dim Tipo As Type For Each tipo In Types If InStr(tipo.FullName, "Connection") > 0 Then Exit For Next ret = _ Activator.CreateInstanceFrom( _ DBObjNames(MyDBType)(DbObj), dll, Tipo.FullName) (...)
Sugestões?
Agradeço desde já!
- Editado InfoProfi domingo, 29 de abril de 2012 03:27
Todas as Respostas
-
Opa, Tudo bem ?
Se o seu objetivo é criar uma instancia da connection do SqlSercerCe, utilize o factory do ado para isso.
var Factory = System.Data.Common.DbProviderFactories.GetFactory("Microsoft.SqlServerCe.Client"); var Connection = Factory.CreateConnection();
[]´s
Rafael Vieira
Rafael Vieira Arquiteto de Software
-
Boas,
O problema tem que ver com o overload que o runtime está a usar (pois para o compilador não há qq problema).
O Activator.CreateInstanceFrom possui vários overload mas com 3 parametros sendo o ultimo uma string apenas tem 1:
public static ObjectHandle CreateInstanceFrom(AppDomain domain, string assemblyFile, string typeName)
Olhando para a mensagem da excepção e fácil ver que o problema está relacionado com o primeiro parametro - AppDomain.
Olhando seu código eu diria que o tipo de retorno do método DBObjNames é object e que o compilador assume tratar-se de uma invocação deste overload:
public static ObjectHandle CreateInstanceFrom(string assemblyFile, string typeName, object[] activationAttributes)
Mas a causa final do problema julgo estar ordem dos parametros. Eu diria que o que pretendes na realidade é:
(...) ret = _ Activator.CreateInstanceFrom( _ dll, Tipo.FullName, DBObjNames(MyDBType)(DbObj)) (...)
que respeita a ordem da assinatura do método:
- primeiro a assembly
- depois o tipo
- e por fim os parametros para a invocação
Nuno Gomes http://nunogomes.net
-
Obrigado a todos pela colaboração.
Vou tentar ser mais claro, peço desculpas, se parecer abuso, mas vou pedir mais um favor.
Eu preciso na verdade, ou criar um com Reflection, dependendo do tipo de banco de dados que o usuario selecionar para o sistema, ou herdar de uma classe, sobrescrevendo, todos os tipos das variáveis para acesso a dados, ou seja, Connections,Commands,Adapters, etc.
Em outras palavras, por exemplo, uma classe pai vai trabalhar com uma SqlServerCe.SqlCeConnection, e esta classe tem toda a implementação que eu preciso pra trabalhar com dados.
Quero herdar esta classe, sobrescrever a variável connection com os tipos OracleClient.OracleConnection, ou SqlClient.SqlConnection, tanto faz.
Só preciso sobrescrever a variável da connection com um outro tipo.
É possível fazê-lo, existe uma maneira mais apropriada? Alguém me dá mais uma dica ou sugestão, por favor?