2011-06-19 5 views
0

ラムダ式を作成して、プロパティ名、値(文字列として)とプロパティタイプ(Typeとして)を作成したいと考えています。ラムダ式の作成ConstantExpression with string value

問題は行内にあります。Expression.Constant(value1, propertyType);
Fooに渡される値1は文字列です。そして「不明」タイプ

static Expression<Func<T, bool>> LabmdaExpression<T>(string property1, string value1, 
                Type propertyType) 
{        
    var parameterExpression = Expression.Parameter(typeof(TheObject), "o"); 
    var memberExpression1 = Expression.PropertyOrField(parameterExpression, property1); 

    //casting? 
    var valueExpression1 = Expression.Constant(value1, propertyType); 

    var binaryExpression1 = Expression.GreaterThan(memberExpression1, valueExpression1); 
    return Expression.Lambda<Func<T, bool>>(binaryExpression1, parameterExpression); 
} 

答えて

0

に解析する必要があります私はあなたが現在TheObjectを持ってTを持つべきだと思います。 (int)"42"ようなコードが有効でないため、

static readonly MethodInfo ChangeTypeMethod = typeof(Convert).GetMethod(
    "ChangeType", new[] { typeof(object), typeof(Type) }); 

static Expression<Func<T, bool>> LabmdaExpression<T>(
    string property1, string value1, Type propertyType) 
{ 
    ParameterExpression parameterExpression = Expression.Parameter(typeof(T), "o"); 
    MemberExpression memberExpression1 = Expression.PropertyOrField(
     parameterExpression, property1); 

    Expression convertedObject = Expression.Call(
     ChangeTypeMethod, Expression.Constant(value1), 
     Expression.Constant(propertyType)); 
    Expression converted = Expression.Convert(convertedObject, propertyType); 

    BinaryExpression binaryExpression1 = Expression.GreaterThan(
     memberExpression1, converted); 
    return Expression.Lambda<Func<T, bool>>(binaryExpression1, parameterExpression); 
} 

だけキャストが動作しません。

はあなたの表現で Convert.ChangeType()メソッドを呼び出し、その結果のオブジェクトをキャストすることができ、文字列を変換します。

+0

なぜExpression.Convertが必要なのでしょうか? – jullin

+0

'Convert.ChangeType()'の戻り値の型は 'object'なので、実際の型にそれをキャストする必要があるからです。コードから直接使用する場合は、同じ操作を行う必要があります。 – svick

+0

あなたは正しいです、私はこれを簡単な例で試しました: 'string x =" 9 "; int xx =(int)Convert.ChangeType(x、typeof(int)); ' – jullin