Usuário com melhor resposta
MethodInfo com Expressoes Lambda

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!!!
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
-
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
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
-
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