Guia de Reflexão em C#: Obtendo Valores de Propriedades e Invocando Métodos

  1. Obtando o valer de uma propriedade de um objeto a partir do nome do campo
        /// <summary>
        /// Obtém o valor de uma propriedade de um objeto usando o nome do campo
        /// </summary>
        /// <param name="nomeCampo">Nome do campo/propriedade</param>
        /// <param name="instancia">Instância do objeto</param>
        /// <returns>Valor da propriedade como string</returns>
        public string ObterValorPropriedade(string nomeCampo, object instancia)
        {
            try
            {
                Type tipo = instancia.GetType();
                object valor = tipo.GetProperty(nomeCampo).GetValue(instancia, null);
                string resultado = Convert.ToString(valor);
                if (string.IsNullOrEmpty(resultado)) return null;
                return resultado;
            }
            catch
            {
                return null;
            }
        }

Exemplo de utilização

                    //Com base no valor do input, verificar se há entrada na porta IO

                    //if (this.txt_input.Text == "6")//sem reflexão, seria necessário escrever muito código
                    //{
                    //    if (Global.myAdam6250.DI_6 == "True")
                    //    {
                    //        Flag_Tighten_Done = true;
                    //    }
                    //}

                    string nomePropriedade = "DI_" + this.txt_input.Text;
                    string valorEntrada = ObterValorPropriedade(nomePropriedade, Global.myAdam6250);
                    if (valorEntrada == "True")
                    {
                        Flag_Tighten_Done = true;
                        if ( flagSaidaConfigurada == true )
                        {
                            InvocarMetodo(formMonitor, nomeMetodo, null);
                            flagSaidaConfigurada = false;
                        }
                    }

  1. Invocendo um método de um objeto a partir do nome do método
        /// <summary>
        /// Invoca um método de um objeto específico pelo nome
        /// </summary>
        /// <param name="objeto">Instância do objeto contendo o método</param>
        /// <param name="nomeMetodo">Nome do método a ser invocado</param>
        /// <param name="parametros">Parâmetros a serem passados (opcional)</param>
        public void InvocarMetodo(object objeto, string nomeMetodo, object[] parametros = null)
        {
            try
            {
                Type tipo = objeto.GetType();
                //Obtém os métodos públicos do objeto
                MethodInfo infoMetodo = tipo.GetMethod(nomeMetodo);
                //Executa o método
                infoMetodo.Invoke(objeto, parametros);
            }
            catch (Exception)
            {
                throw;
            }
        }

Exemplo de utilização:

                    //Enviar sinal para saída IO, ligar indicador de peça coletada
                    string nomeMetodo = "SetOut_" + this.txt_output.Text;
                    if (StringHelper.IsInteger(this.txt_output.Text))
                    {
                        if ( flagSaidaConfigurada == false )
                        {
                            InvocarMetodo(formMonitor, nomeMetodo, null);
                            flagSaidaConfigurada = true;
                        }
                    }

Tags: CSharp reflection propertyinfo methodinfo metaprogramming

Publicado em 6-1 20:41 por Thomas