2016-11-08 2 views
0

Was ist der beste Weg, um alle PropertyInfo von Elementen in einem Lambda-Ausdruck zu erhalten.Get Propertyinfo von Lambda-Ausdruck, schlägt aber mit Int

Ich möchte einen Filter für ein XML-Feld in einer SQL-Datenbank festlegen.

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

im Analysator, ich bin in der Lage, die Propertyinfo für die Name-Eigenschaft zu bekommen.

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; 
} 

Dies gibt die Eigenschaft zurück, wenn es sich um eine String-Eigenschaft handelt. aber im Falle eines int schlägt der Analysator fehl, weil Lambda eine Konvertierungsfunktion hinzugefügt hat.

{x => Convert(x.ID)} 

Es wurde eine Konvertierungsfunktion hinzugefügt.

Also was ist die beste Methode, um die Propertyinfo in diesem Fall für die x.ID. und wie verhindere ich die Verwendung der Konvertierungsfunktion

Antwort

2

Die Tatsache, dass Compiler fügt Convert Ausdruck angibt, dass Sie nicht generische Lambda-Ausdruck mit object Rückgabetyp verwenden. Etwas wie folgt aus:

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

Eine Möglichkeit, das Problem zu lösen ist die Methode generisch (ähnlich wie LINQ OrderBy) zu machen:

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

so gibt Convert nicht mehr sein wird.

Eine weitere Möglichkeit ist es, das Verfahren so zu halten ist, und der Streifen die erste Convert falls vorhanden:

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

Dank. für deine Antwort. Ich habe den Konvertiten entkleidet, wie du gesagt hast. Aber danke für die Info über den Grund, warum Convert hinzugefügt wird. – Frans

Verwandte Themen