Gegeben eine Art ExpressionType.MemberAccess, wie bekomme ich den Wert des Feldes?
Ich bin parsing-Ausdruck-Baum. Gegeben eine NodeType-der ExpressionType.MemberAccess, wie bekomme ich den Wert des Feldes?
C# MSDN-Dokumentation:
MemberAccess ist Ein Knoten für das Lesen aus einem Feld oder einer Eigenschaft.
Einen code-snippet, das wäre unglaublich, unglaublich hilfreich. Vielen Dank im Voraus!!!
Mein code sieht ungefähr so aus:
public static List<T> Filter(Expression<Func<T, bool>> filterExp)
{
//the expression is indeed a binary expression in this case
BinaryExpression expBody = filterExp.Body as BinaryExpression;
if (expBody.Left.NodeType == ExpressionType.MemberAccess)
//do something with ((MemberExpressionexpBody.Left).Name
//right hand side is indeed member access. in fact, the value comes from //aspdroplist.selectedvalue
if (expBody.Right.NodeType == ExpressionType.MemberAccess)
{
//how do i get the value of aspdroplist.selected value?? note: it's non-static
}
//return a list
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
[aktualisiert für Klarheit]
Ersten; warf die
Expression
zu einemMemberExpression
.Einen
MemberExpression
hat zwei Dinge von Interesse:PropertyInfo
/FieldInfo
dem Mitgliedalso, wenn du beurteilen kannst, die
.Expression
zu "obj", und die.Member
ist einFieldInfo
, dann können Sie den tatsächlichen Wert über.GetValue(obj)
auf dieFieldInfo
(undPropertyInfo
ist sehr ähnlich).Das problem ist, dass die Bewertung der
.Expression
ist sehr schwierig ;-pOffensichtlich hat man Glück, wenn es sich herausstellt, ein
ConstantExpression
- aber in den meisten Fällen ist es nicht; es könnte einParameterExpression
(in diesem Fall müssen Sie wissen, der eigentliche parameter-Wert ein, den Sie auswerten möchten), oder jede andere Kombination vonExpression
s.In vielen Fällen eine einfache (vielleicht auch faul) Möglichkeit ist die Verwendung
.Compile()
zu bekommen .NET framework zu tun, die schweres heben; Sie können dann bewerten die lambda als typisierte delegieren (übergang in die Parameter der lambda-Ausdruck benötigt). Dies ist nicht immer eine option, jedoch.Zeigen, wie Komplex diese ist; betrachten Sie dieses einfache Beispiel (wo ich noch hard-codiert, bei jedem Schritt, anstatt dem testen etc):
thank you so so viel zu Marc Gravell oben. Ich bin wirklich dankbar für seine Hilfe.
Es stellt sich heraus, in meinem Fall. das problem kann gelöst werden über:
Nochmals vielen Dank Mark!
object value = Expression.Lambda<Func<object>>(Expression.Convert(expBody.Right, typeof(object))).Compile().Invoke()