Как создать NotStarts с деревом выражений - PullRequest
1 голос
/ 15 августа 2011

Я использую 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 ошибку.

Кто-нибудь знает, почему это не работает или лучший способ подойти к этому?

Ответы [ 2 ]

5 голосов
/ 15 августа 2011

Вы проверяете метод 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

0 голосов
/ 19 августа 2012

я знаю, что на вопрос был дан ответ, но другой подход доступен и прост:

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

condition = Expression.Not(condition);

и ... готово!просто нужно отрицать выражение.

...