| 

.NET C# Java Javascript Exception

7
Guten Abend Zusammen,
ich habe sowas
public Action<TType, object> Action { get; set; }

dem weise einen Lamdba Expession zu:
(t, val) => t.Log.Benutzer = val)


t.Log.Benutzer
möchte ich als String oder Expression irgendwann aber wieder rausholen.
Geht das?
25.03.2014
Jorgen Schumann 1,6k 2 9
1 Antwort
3
Ja, das geht mit Funktionalität aus dem System.Linq.Expressions Namespace. Das folgende Beispiel sollte Deine Frage beantworten:

[Fact]
public void Test()
{
Expression<Action<int>> exp = i => i.GetType();

Assert.Equal(ExpressionType.Lambda, exp.NodeType);
Assert.Equal("i => i.GetType()", exp.ToString());
Assert.Equal(typeof(int), exp.Parameters[0].Type);
MethodCallExpression call = exp.Body as MethodCallExpression;
Assert.Equal(typeof(int).GetMethod("GetType").Name, call.Method.Name);

var action = exp.Compile();
Assert.Equal(typeof(int), action(5));
}

Ohne diese Funktionalität wäre kein Linq2Anything (z.B. Linq2Sql) möglich. Linq Abfragen auf einem z.B. EF DbContext werden als Expressions entgegengenommen, dann wird der ExpressionTree analysiert und entsprechend in SQL Statements transformiert. Die direkte Zuweisung wie in der ersten Zeile des Beispiels funktioniert aber leider nur mit LambdaExpressions. StatementExpressions kannst Du auf diese Weise nicht zuweisen. Du kannst aber die Klassen aus dem Namespace verwenden, um zu Fuß StatementExpressions aufzubauen und zu kompilieren. Das ist seit .NET 3.5 eine echte Alternative zur Laufzeitcodegenerierung via Reflection.Emit.
26.03.2014
ffordermaier 8,4k 3 9

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH