2011-08-15 1 views
1

私はjqGridを使ってデータを表示しています。 jqGridは、私がStartsWithを使用する場合、私は有効な結果(次のようになります)を取得NotStartsWith Expression treeを作成するには

など、文字列は、等しいNotEqualsのような比較が含ま、STARTSWITH、NotStartsWithん検索機能を持っています

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

DoesNotStartWith」のdoesnのので、 tは私がそれを作成した存在:

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エラーを取得します。

誰もがこれがうまくいかない理由やこれに対処するより良い方法を知っていますか?

答えて

5

タイプ文字列のメソッドNotStartsWithが存在しないことを確認しています。 typeof(string)の代わりに、NotStartsWith拡張メソッドを置くクラスを使用してtypeof(ExtensionMethodClass)を試してください。拡張メソッドは実際に型自体には存在しません。

編集:また、このようなあなたの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

'typeof(string)'を 'typeof(MyExtensionClass)'に変更しましたが、静的メソッドがnullインスタンスを必要とするという新しいエラーが発生しました。パラメータ名:インスタンス '。これは別のスレッドhttp://stackoverflow.com/questions/3695235/expression-equals/3695436#3695436で尋ねられましたが、私はどのように問題を解決するのか分かりません。 – Darcy

+0

'Expression.Call'は、渡されるメソッド情報のために送信する最初の引数を検索しています。静的メソッド(非インスタンス)のため動作しません。このような、 'Expression.Call'の異なるオーバーロードを使用しなければなりません、http://msdn.microsoft.com/en-us/library/dd324092.aspx。最初にメソッド情報を与え、次に2つの引数を与えます。 – Kratz

+0

Kratzに提供したコード例をありがとう! 'NotStartsWith'はうまくいきます。私は本当に助けに感謝します。 – Darcy

0

は答えたが、別のアプローチが利用可能であり、簡単ですした

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

condition = Expression.Not(condition); 

と...やりました!表現を否定するだけです。

関連する問題