none
MethodInfo com Expressoes Lambda RRS feed

  • Pergunta

  • pessoal estou com uma problema que nao consigo resolver 

    MethodInfo methodInfo = type.GetMethod("ListarMuitos");

    object listarMuitos = methodInfo.Invoke(classObject, new Object[] { Expessao });

     

    quando eu fazer esse Invoke  como eu faço para passar uma expressao Lambda?

     

    valew pela ajuda


    Em Busca... Busca de que? De conhecimento e claro!!!
    quinta-feira, 8 de dezembro de 2011 11:37

Respostas

  • Você pode utilizar as classes Action e Func para passar lambdas. Elas encapsulam delegates que não têm retorno e com retorno, respectivamente. Exemplo: public class Teste { public void Metodo(Action a) { Console.WriteLine("Chamando a Action:"); a(); } } Na chamada via reflection: Action a = new Action(() => Console.WriteLine("Hello!")); Teste t = new Teste(); t.GetType().InvokeMember("Metodo", BindingFlags.InvokeMethod, null, t, new object[] { a });
    • Marcado como Resposta mkn.Net quinta-feira, 8 de dezembro de 2011 18:28
    quinta-feira, 8 de dezembro de 2011 13:28
  • Usei Func 

     

            public sealed class Lambda<T>
            {
                public static Func<T, T> Cast = x => x;
            } 
    

    e Chamei assim Vou postar o codigo completo da chamada pode ser util para outras pessoas

    Type type = _obj.GetType();
    
                    ConstructorInfo constructorInfo = type.GetConstructor(new Type[] { typeof(string) });
                    object classObject = constructorInfo.Invoke(new Object[] { "chave" });
                    MethodInfo methodInfo = type.GetMethod("ListarMuitos");
                    
                    var c = Lambda<Func<object, bool>>.Cast;
                    
                    var ExLambda = c(x => x.GetType().GetProperty("Nome").GetValue(x, null).ToString().Contains("Meu Texto para pesquisa"));
    ExLambda = c(where => where.GetType().GetProperty(((Pesquisa)comboBox1.SelectedItem).Campo)
    .GetValue(where, null).ToString().ToUpper().Contains(textBoxFiltro.Text.ToString().ToUpper()) || where.GetType().GetProperty(((Pesquisa)comboBox1.SelectedItem).Campo) .GetValue(where, null).ToString().ToUpper().Equals(textBoxFiltro.Text.ToString().ToUpper())); var listarMuitos = methodInfo.Invoke(classObject, new Object[] { ExLambda });
    IEnumerable<Object> itemsSource = ((IEnumerable<Object>)listarMuitos); dataGridPesquisa.ItemsSource = itemsSource;


    e a variavel _obj e onde eu passe minha classe (Repositorio)

     

    Vou deixar o codigo ai pq se alguem quizer Ivocar um method que tenha como parametro uma expressao lambda assim funciona

     

    valew pela ajuda

     


    Em Busca... Busca de que? De conhecimento e claro!!!
    • Marcado como Resposta mkn.Net quinta-feira, 8 de dezembro de 2011 18:27
    quinta-feira, 8 de dezembro de 2011 18:27

Todas as Respostas

  • Você pode utilizar as classes Action e Func para passar lambdas. Elas encapsulam delegates que não têm retorno e com retorno, respectivamente. Exemplo: public class Teste { public void Metodo(Action a) { Console.WriteLine("Chamando a Action:"); a(); } } Na chamada via reflection: Action a = new Action(() => Console.WriteLine("Hello!")); Teste t = new Teste(); t.GetType().InvokeMember("Metodo", BindingFlags.InvokeMethod, null, t, new object[] { a });
    • Marcado como Resposta mkn.Net quinta-feira, 8 de dezembro de 2011 18:28
    quinta-feira, 8 de dezembro de 2011 13:28
  • Usei Func 

     

            public sealed class Lambda<T>
            {
                public static Func<T, T> Cast = x => x;
            } 
    

    e Chamei assim Vou postar o codigo completo da chamada pode ser util para outras pessoas

    Type type = _obj.GetType();
    
                    ConstructorInfo constructorInfo = type.GetConstructor(new Type[] { typeof(string) });
                    object classObject = constructorInfo.Invoke(new Object[] { "chave" });
                    MethodInfo methodInfo = type.GetMethod("ListarMuitos");
                    
                    var c = Lambda<Func<object, bool>>.Cast;
                    
                    var ExLambda = c(x => x.GetType().GetProperty("Nome").GetValue(x, null).ToString().Contains("Meu Texto para pesquisa"));
    ExLambda = c(where => where.GetType().GetProperty(((Pesquisa)comboBox1.SelectedItem).Campo)
    .GetValue(where, null).ToString().ToUpper().Contains(textBoxFiltro.Text.ToString().ToUpper()) || where.GetType().GetProperty(((Pesquisa)comboBox1.SelectedItem).Campo) .GetValue(where, null).ToString().ToUpper().Equals(textBoxFiltro.Text.ToString().ToUpper())); var listarMuitos = methodInfo.Invoke(classObject, new Object[] { ExLambda });
    IEnumerable<Object> itemsSource = ((IEnumerable<Object>)listarMuitos); dataGridPesquisa.ItemsSource = itemsSource;


    e a variavel _obj e onde eu passe minha classe (Repositorio)

     

    Vou deixar o codigo ai pq se alguem quizer Ivocar um method que tenha como parametro uma expressao lambda assim funciona

     

    valew pela ajuda

     


    Em Busca... Busca de que? De conhecimento e claro!!!
    • Marcado como Resposta mkn.Net quinta-feira, 8 de dezembro de 2011 18:27
    quinta-feira, 8 de dezembro de 2011 18:27