none
Instanciar Objeto via Reflection RRS feed

  • 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
    domingo, 29 de abril de 2012 03:26

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

    domingo, 6 de maio de 2012 22:08
  • 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

    domingo, 6 de maio de 2012 22:37
  • 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?

    terça-feira, 19 de junho de 2012 15:21