如何创建notstartswithexpression树

本文关键字:notstartswithexpression 创建 何创建 | 更新日期: 2023-09-27 18:05:44

我使用jqGrid向用户显示一些数据。jqGrid具有搜索功能,可以进行字符串比较,如Equals, NotEquals, Contains, StartsWith, NotStartsWith等。

当我使用StartsWith时,我得到有效的结果(看起来像这样):

Expression condition = Expression.Call(memberAccess,
                typeof(string).GetMethod("StartsWith"),
                Expression.Constant(value));

由于DoesNotStartWith不存在,我创建了它:

public static bool NotStartsWith(this string s, string value)
{
    return !s.StartsWith(value);
}

这是可行的,我可以创建一个字符串并像这样调用这个方法:

string myStr = "Hello World";
bool startsWith = myStr.NotStartsWith("Hello"); // false

现在我可以像这样创建/调用表达式:

Expression condition = Expression.Call(memberAccess,
                typeof(string).GetMethod("NotStartsWith"),
                Expression.Constant(value));

但是我得到一个ArgumentNullException was unhandled by user code: Value cannot be null. Parameter name: method错误。

有谁知道为什么这不起作用或者有更好的方法来处理这个问题吗?

如何创建notstartswithexpression树

您正在检查类型字符串上的NotStartsWith方法,该方法不存在。不要使用typeof(string),试试typeof(ExtensionMethodClass),使用放置NotStartsWith扩展方法的类。扩展方法实际上并不存在于类型本身,它们只是表现得像它们一样。

编辑:也重新安排你的Expression.Call呼叫像这样,

Expression condition = Expression.Call(
            typeof(string).GetMethod("NotStartsWith"),
            memberAccess,
            Expression.Constant(value));

你正在使用的重载期望一个实例方法,这个重载期望一个静态方法,基于你引用的SO帖子。看这里,http://msdn.microsoft.com/en-us/library/dd324092.aspx

我知道这个问题得到了回答,但是另一种方法是可用的,而且很简单:

Expression condition = Expression.Call(memberAccess,
                                       typeof(string).GetMethod("StartsWith"),
                                       Expression.Constant(value));
condition = Expression.Not(condition);

…完成了!

相关文章:
  • 没有找到相关文章