簡體   English   中英

Lambda和Expression.Call用於擴展方法

[英]Lambda and Expression.Call for an extension method

我需要為這里的方法實現一個表達式:

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);

但對於我的擴展方法:

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

不幸的是,下一個代碼為參數“method”拋出了一個ArgumentNullException:

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

我做錯了什么?

試試這個

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();

你可以這樣做:

var like = typeof(StringEx).GetMethod("Like", new[] {typeof(string), typeof(string)});

comparer = Expression.Call(null, like, prop, value);

您可以將prop作為第一個參數傳遞,將value作為第二個參數傳遞給上面。

在應用擴展方法之前,您可能需要獲得完整的查詢。

我不確定,但是你只能使用反射從靜態類中獲取擴展方法。 擴展方法沒有真正添加到類中,因此無法使用GetMethod檢索。

使用

var like = typeof(StringEx).GetMethod("Like", new[] {typeof(string),typeof(string)});

即。 從擴展類型中檢索它,而不是從擴展類型中檢索它。

如果你想讓你的擴展方法有效,你必須這樣做:

string str = "some string";
str.Like("second string");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM