Get-Parameter aus Aktion<T>
Wie bekomme ich den übergebenen Parameter in eine Action<T>
? Das code-Beispiel sollte hervorheben, was ich versuche zu erreichen. Sorry, dass es ein wenig lange.
class Program
{
static void Main(string[] args)
{
Foo foo = new Foo();
foo.GetParams(x => x.Bar(7, "hello"));
}
}
class Foo
{
public void Bar(int val, string thing) { }
}
static class Ex
{
public static object[] GetParams<T>(this T obj, Action<T> action)
{
//Return new object[]{7, "hello"}
}
}
Nur die Optionen, die das Aussehen vage sinnvoll sind GetInvocationList(), Methode und Ziel. Aber keiner von Ihnen scheinen die Daten enthält, bin ich nach (ich denke es ist wegen der Art, habe ich erklärt, die Aktion). Dank
EDIT: Es sind nicht die Typen, die ich will, es ist die eigentliche Werte - wie bereits in den kommentierten code.
- das ist nicht so, nur wenn es war foo.GetParams(x => x.Bar);
- Sind Sie nach dem erfassten vars?
- Ja, das ist richtig
- Wenn Sie nichts dagegen haben mich gefragt, warum Sie dies tun müssen?
- Ich weiß von verschiedenen Anwendungen, die ich verwendet habe, ist meistens für RPC abfangen.
- Ich bin nur liebäugelt mit dem schreiben von ein Mocking-Framework (zum Spaß, nicht das wirkliche Leben). Dies war nur eine der Möglichkeiten, die ich habe versucht, herauszufinden, welche Parameter verwendet werden. Die syntax ist die gleiche wie Rhino Mocks.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zu tun, dass, sollte es tatsächlich eine
Expression<Action<T>>
. Dann ist es ein Fall von der ZERLEGUNG der Ausdruck. Zum Glück habe ich den code für das über in protobuf-net, hier - insbesondereResolveMethod
gibt die Werte in derout
array (nachdem man alle aufgenommenen Variablen, etc).Nach
ResolveMethod
öffentlichkeit (und entfernen alles obenResolveMethod
), der code ist einfach:ResolveMethod
gibt auch dieMethodInfo
- also die Tatsache, dass Sie riefeBar
)RpcUtils
, das spielt keine Rolle für diese)=>{...}
(die Klammern wichtig). Aber wenn Sie benötigen, Delegierter, rufen Sie einfachCompile()
auf den Ausdruck.Es sollte so etwas wie dieses:
sollten Sie einige überprüfen, um zu überprüfen, dass nichts ungültig sein können geschickt in die Handlung, als nicht alles zu werfen, um ein MethodCallExpression, aber Sie sollten in der Lage sein zu Folgen, von dort
Ihre Aktion
x => x.Bar(7, "hello")
kann umgeschrieben werden alsEs ist jetzt klar, dass
7
und"hello"
sind nicht die Parameter, die von der Aktion, nurx
ist.Um Zugang zu
7
und"hello"
Sie brauchen einen Zugang zu den Ausdruck, wie das, was @Marc schlägt. Aber es ist nicht klar, wie Ihr code sollte in der Lage kompliziertere Ausdrücke, wiex => 1 + x.Bar(7, x.Baz("hello", x.Quux(Application.Current)))
.Quux
undBaz
etc, um zu versuchen, um einfach nur Werte zu berichten, wie die args.x.Bar
. Hinzufügen 1 wird davon ausgegangen, dass es einint
, aber Ihre tatsächliche Typ unterschiedlich sein können.