2012-05-10 9 views
0

に私は昨日から式ツリー自分自身を教えてきたと私は2つの文字列値を比較する問題を抱えています。私はエラーで失敗し、このテストケースを作った:使用string.Compare(a、b)は式

No method 'Compare' on type 'System.String' is compatible with the supplied arguments.

は、私がExpression.Equal, LessThan, LessThanOrEqual, GreaterThan or GreaterThanOrEqualその結果、左&右を使用しますleft = Expression.Call(

Type type = typeof(string); 
Expression left, right; 
left = Expression.Constant("1", type); 
right = Expression.Constant("2", type); 
// fails at run-time on the next statement 
left = Expression.Call(
    typeof(string), 
    "Compare", 
    new Type[] { type, type }, 
    new Expression[] { left, right }); 
right = Expression.Constant(0, typeof(int)); 

上で実行時に失敗します。これがCompareメソッドの理由です。

私はその何かがシンプル確信している、と私はこの単純なテストケースに私のコードを煮詰めてきました。誰かが私が間違っているのを見た? - 彼らはジェネリック引数、ではない通常のパラメータのタイプだ

new Type[] { type, type }, 

string.Compare<string, string>を呼び出すようにしようとしている:

答えて

8

これはあなたのExpression.Callコードに問題です。それは非ジェネリックメソッドだということを考えると、ちょうどここにヌルを使用しています。

短いが完全なプログラム:

using System; 
using System.Linq.Expressions; 

class Test 
{ 
    static void Main() 
    { 
     var left = Expression.Constant("1", typeof(string)); 
     var right = Expression.Constant("2", typeof(string)); 
     var compare = Expression.Call(typeof(string), 
             "Compare", 
             null, 
             new[] { left, right }); 
     var compiled = Expression.Lambda<Func<int>>(compare).Compile(); 
     Console.WriteLine(compiled()); 
    } 
} 
1

私はラムダwhere句(SQLにLINQ)と同様の操作を行うとしていた、と様々な検索はこのページで私を上陸させたので、私は共有しますので、ここでは、そのような解決策は、場合には、それはここに上陸他の人を助けます。

比較総称式で作業を簡素化すると最も簡単です。その後

public static Expression CompareLessThanOrEqualTo(Expression e1, Expression e2) 
    { 
     var compare = Expression.Call(typeof(string), 
          "Compare", 
          null, 
          new[] { e1, e2 }); 

     return Expression.LessThanOrEqual(compare, Expression.Constant(0)); 
    } 

使用は、他の

public static Expression<Func<TypeOfParent, bool>> PropertyLessThanOrEqualString<TypeOfParent, String>(PropertyInfo property, String value) 
    { 
     var parent = Expression.Parameter(typeof(TypeOfParent)); 
     var expressionBody = CompareLessThanOrEqualTo(Expression.Property(parent, property), Expression.Constant(value)); 
     return Expression.Lambda<Func<TypeOfParent, bool>>(expressionBody, parent); 
    } 

魔女のように、この表現は、あなたがが選択したフィルタのリストを持っている場合

public static IQueryable<T> ApplyFilters<T>(this IQueryable<T> query, List<GridFilters> gridFilters) 
{ 
    // foreach filter 
     // Get property (propertyInfo) 
     // Get Value(s) 
     // Apply Filter 
     query = query.Where(PropertyGreaterThanOrEqualString<T, string>(propertyInfo, value1)); 

    // ... 

    return query; 
} 

これが有用であるように使用することができあなたが適用する必要があるユーザー、値と演算子を両方選択することができます。 (レンジの間では、開始含まれています)

関連する問題