2016-11-08 8 views
0

ラムダ式の項目のすべてのPropertyInfoを取得する最適な方法は何ですか?lambda式からpropertyinfoを取得しますが、intで失敗します

私はSQLデータベースのxmlフィールドにフィルタを設定します。

var FilterBase = new FilterBase<SimpleItemSubObject>() 
        .SetSimpleFilter(x => x.ID, 123) 
        .SetSimpleFilter(x => x.Test.Name, "demo3"); 

アナライザーでは、Nameプロパティのpropertyinfoを取得できます。

internal IEnumerable<PropertyInfo> GetExpressionList() 
{ 
    return GetPropertyListfor(lambda.Body as MemberExpression); 
} 

private IEnumerable<PropertyInfo> GetPropertyListfor(MemberExpression body) 
{ 
    var result = new List<PropertyInfo>(); 
    if (body != null && body.Expression != null) 
    { 
     result.AddRange(GetPropertyListfor(body.Expression as MemberExpression)); 
     result.Add((body as MemberExpression).Member as PropertyInfo); 
    } 

    return result; 
} 

これは、文字列プロパティの場合、propertyinfoを返します。 intの場合、ラムダが変換関数を追加したため、アナライザは失敗します。

{x => Convert(x.ID)} 

変換機能が追加されました。

この場合、x.IDのpropertyinfoを取得する最も良い方法は何ですか。どのようにして変換関数の使用を防止するのですか?

答えて

2

Convert式を追加するという事実は、object戻り値の型で非汎用ラムダ式を使用していることを示しています。このような何か:問題を解決する

public class FilterBase<T> 
{ 
    public FilterBase<T> SetSimpleFilter(Expression<Func<T, object>> selector, object value) 
    { 
     // ... 
     return this; 
    } 
} 

一つの方法は、(LINQ OrderByに類似)の方法は一般的なようにすることです:

public FilterBase<T> SetSimpleFilter<V>(Expression<Func<T, V>> selector, V value) 

ので、もうConvertがありません。

internal IEnumerable<PropertyInfo> GetExpressionList() 
{ 
    var body = lambda.Body; 
    if (body.NodeType == ExpressionType.Convert) 
     body = ((UnaryExpression)body).Operand; 
    return GetPropertyListfor(body as MemberExpression); 
} 
+0

感謝:

もう一つの方法は、最初Convertあればあるような方法を維持し、取り除くことです。あなたの答えです。あなたが言ったように私は改宗者を取り除いた。しかし、convertが追加された理由についての情報に感謝します。 – Frans

関連する問題