如何创建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
错误。
有谁知道为什么这不起作用或者有更好的方法来处理这个问题吗?
您正在检查类型字符串上的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);
…完成了!