2016-11-08 82 views
0

獲得lambda表達式中項目的所有PropertyInfo的最佳方法是什麼?從lambda表達式獲取propertyinfo,但失敗int

我想在sql數據庫的xml字段上設置一個過濾器。

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

在de分析器中,我能夠獲取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的情況下分析器失敗,因爲lambda已經添加了一個轉換函數。

{x => Convert(x.ID)} 

它增加了一個轉換函數。

那麼在這種情況下爲x.ID獲取propertyinfo的最佳方法是什麼?以及如何防止使用轉換函數

回答

2

編譯器添加Convert表達式表示您使用的非泛型lambda表達式與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了。

的另一種方法是保持方法是,並去掉所述第一Convert如有:

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

感謝。爲你的答案。我像你說的那樣剝離了轉換器。但是,感謝關於爲什麼要添加轉換的信息。 – Frans