ich die folgende KlasseErhalten Sie den Parameterwert aus einer Linq Expression
public class MyClass
{
public bool Delete(Product product)
{
// some code.
}
}
Jetzt habe ich eine Hilfsklasse, die wie dieser Code zu verwenden, um von irgendwo
public class Helper<T, TResult>
{
public Type Type;
public string Method;
public Type[] ArgTypes;
public object[] ArgValues;
public Helper(Expression<Func<T, TResult>> expression)
{
var body = (System.Linq.Expressions.MethodCallExpression)expression.Body;
this.Type = typeof(T);
this.Method = body.Method.Name;
this.ArgTypes = body.Arguments.Select(x => x.Type).ToArray();
this.ArgValues = ???
}
}
Die Idee ist aus:
// I am returning a helper somewhere
public Helper<T> GetMethod<T>()
{
var product = GetProduct(1);
return new Helper<MyClass>(x => x.Delete(product));
}
// some other class decides, when to execute the helper
// Invoker already exists and is responsible for executing the method
// that is the main reason I don't just comile and execute my Expression
public bool ExecuteMethod<T>(Helper<T> helper)
{
var instance = new MyClass();
var Invoker = new Invoker(helper.Type, helper.Method, helper.ArgTypes, helper.ArgValues);
return (bool)Invoker.Invoke(instance);
}
der Punkt, wo ich stecken bin, ist, wie die Argumente aus dem Ausdruck selbst zu extrahieren.
fand ich diese Art und Weise
((ConstantExpression)((MemberExpression)body.Arguments[0]).Expression).Value
, die ein Objekttyp mit einem Feld „Produkt“ zu sein scheint, aber ich glaube, es muss eine einfachere Lösung sein.
Irgendwelche Vorschläge.
aktualisieren
Nur um zu klären, ich meinen Code modifiziert nach, was ich achive wollen. In meiner realen Wort Anwendung habe ich schon eine Klasse, die das gleiche tut, aber ohne einen Ausdruck Baum:
var helper = new Helper(typeof(MyClass), "Delete",
new Type[] { typeof(Product) }, new object[] {product}));
Der Hauptgrund für meine Helper<T>
ist die Überprüfung Compile-Zeit zu haben, wenn die Methode Signatur gültig ist.
Update 2
Dies ist meine aktuelle Implementierung ist, gibt es einen besseren Weg, um die Werte zu den acces, ohne Reflexion mit?
gibt es keinen Grund, warum Sie können nicht nur die kompilieren Ausdruck und führen Sie es aus? Oder macht das nur Spaß, um Ausdrucksbäume zu lernen? –
@rbev +1 schlag mich dazu. – Aron
Hey, warum nicht einfach direkt 'Delete (product)' aufrufen? – Aron