2010-12-30 5 views
2

Ich frage mich, ob es möglich ist, diese Expression-Builder-Klasse zu verwenden, um dynamische Lambda-Ausdrücke zu generieren, wobei der zu filternde Typ zur Kompilierungszeit nicht bekannt ist.Erstellen von LINQ-Ausdrücken dynamisch mit unbekannten Typen

Ich habe eine Methode, die die Expressionskonstrukte,

public static Expression<Func<T, bool>> GetExpression<T>(IList<QueryFilter> filters) 

Und ein Queryfilter-Objekt,

public class QueryFilter 
{ 
    public string PropertyName { get; set; }  
    public ExpressionType OpType { get; set; } 
    public object Value { get; set; } 
} 

Wo Sie einen neuen Ausdruck erzeugen können, die Aufgabe T filtert die QueryFilters verwenden, die in übergeben werden Ich möchte eine Methode entwickeln, bei der der Typ nicht bekannt ist, d.

public static Expression<Func<T,bool>> GetExpression(IList<QueryFilter> filters, Type type) 

So kann ich den Typen als Parameter, von Anrufen zu System.Reflection passieren, anstatt es in Code angeben zu müssen. Zum Beispiel etwas in diesen Zeilen,

public static Expression NewExpression(IList<QueryFilter> filters, Type T) 
    { 
     return GetExpression<Type>(filters); 
    } 

Wenn es möglich ist, diese Syntax zu verwenden, wo Type das generische 'T' ersetzt? Da ich mich glaube nicht, dass eine Laufzeit dynamisch Typen innerhalb der <> Klammern angeben kann, gibt es eine andere Art und Weise, vielleicht

mit
Func<object,bool> 

statt?

Antwort

0

Versuchen mit DynamicExpression.ParseLambda Arbeits

+0

verwenden, danke. Ein Problem, das mir aufgefallen ist, ist jedoch, dass, wenn Sie die Zeichenfolgendarstellung eines Binary-Lambda-Ausdrucks für "TimeOfAction> @ 0" angeben, die .ToString() -Darstellung des erstellten Ausdrucks "GreaterThan" oder "LessThan" statt der entsprechenden angibt Symbol. Wie kann ich die binäre Operation dynamisch festlegen? – sean

+0

Sorry ich weiß nicht, vielleicht sollten Sie eine andere Frage stellen –

0

können Sie entweder Predicate Builder oder die Arbeit Dies sollte Dynamic Linq Library (.NET 3.5).

+0

Ich bemerkte, dass die Dynamic Linq-Bibliothek und Linq.Expressions Namespace beide eine DynamicExpression Klasse mit verschiedenen Mitgliedern haben, so dass die IDE eine Beschwerde über den Konflikt wirft. Wie lösen Sie das normalerweise auf? – sean

+0

@sean: Mit Blick auf die MSDN-Dokumentation scheint die 'DynamicExpression'-Klasse in .NET Framework 4.0 mit einigen" Verbesserungen "enthalten zu sein. Daher würde die Dynamic Linq-Bibliothek nur unter .NET 3.5 unverändert funktionieren –