LAMBDA和Ex pression.Call延期方法 [英] Lambda and Expression.Call for an extension method

查看:119
本文介绍了LAMBDA和Ex pression.Call延期方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要实现一个前pression对于喜欢这里的方法:

I need to implement an expression for a method like here:

var prop = Expression.Property(someItem, "Name"); 
var value = Expression.Constant(someConstant);

var contains = typeof(string).GetMethod("Contains", new[] {typeof(string)});
var expression = Expression.Call(prop, contains, value);

但我的扩展方法:

But for my extension method:

public static class StringEx
{
    public static bool Like(this string a, string b)
    {
        return a.ToLower().Contains(b.ToLower());
    }
}

不幸的是,接下来的code抛出一个ArgumentNullException的参数的方法:

Unfortunately, next code throws an ArgumentNullException for a parameter "method":

var like = typeof(string).GetMethod("Like", new[] {typeof(string)});
comparer = Expression.Call(prop, like, value);

我在做什么错了?

What I'm doing wrong?

推荐答案

试试这个

public class Person
{
    public string Name { get; set; }
}
public static class StringEx
{
    public static bool Like(this string a, string b)
    {
        return a.ToLower().Contains(b.ToLower());
    }
}


        Person p = new Person(){Name = "Me"};
        var prop = Expression.Property(Expression.Constant(p), "Name");
        var value = Expression.Constant("me");
        var like = typeof(StringEx).GetMethod("Like", BindingFlags.Static
                    | BindingFlags.Public | BindingFlags.NonPublic);
        var comparer = Expression.Call(null, like, prop, value );

        var vvv = (Func<bool>) Expression.Lambda(comparer).Compile();
        bool isEquals = vvv.Invoke();

这篇关于LAMBDA和Ex pression.Call延期方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆