Ich bin mir im Klaren, dass es im Allgemeinen Auswirkungen der Reflexion auf die Leistung gibt. (Ich selbst bin kein Fan von Reflexion überhaupt, eigentlich, das eine rein akademische Frage.)Können Sie ein Func <T> (oder ein ähnliches) von einem MethodInfo-Objekt abrufen?
Es wäre eine Klasse gibt es das wie folgt aussieht:
public class MyClass {
public string GetName() {
return "My Name";
}
}
Bär mit mir hier. Ich weiß, dass, wenn ich eine Instanz von MyClass
x
genannt habe, kann ich x.GetName()
anrufen. Außerdem könnte ich eine Func<string>
Variable auf x.GetName
setzen.
Jetzt ist hier meine Frage. Lassen Sie uns sagen, ich nicht wissen, dass die oben genannte Klasse heißt MyClass
; Ich habe ein Objekt, x
, aber ich habe keine Ahnung, was es ist. Ich konnte überprüfen, um zu sehen, ob das Objekt eine GetName
Methode hat dies tun:
MethodInfo getName = x.GetType().GetMethod("GetName");
Angenommen getName
ist nicht null. Dann konnte ich nicht überprüfen, ob getName.ReturnType == typeof(string)
und getName.GetParameters().Length == 0
, und an dieser Stelle wäre ich nicht ganz sicher, dass die Methode von meinem getName
Objekt definitiv auf eine Func<string>
gegossen werden könnte, irgendwie?
Ich weiß, es gibt eine MethodInfo.Invoke
, und ich weiß auch, konnte ich immer erstellen Func<string>
wie:
Func<string> getNameFunc =() => getName.Invoke(x, null);
Ich denke, was ich frage ist, ob es eine Möglichkeit gibt, von ein MethodInfo
zu gehen Objekt bis die tatsächliche Methode, die es darstellt, die Kosten für die Reflexion in der Prozess Prozess, aber nach dieser Punkt in der Lage sein, die mich anrufen thod direkt (über, zum Beispiel, ein Func<string>
oder etwas ähnliches) ohne eine Leistungseinbuße.
Was ich Vorstellungsvermögen könnte wie folgt aussehen: (. Ich weiß, dass es nicht gibt, ich frage mich, ob es etwas wie es)
// obviously this would throw an exception if GetActualInstanceMethod returned
// something that couldn't be cast to a Func<string>
Func<string> getNameFunc = (Func<string>)getName.GetActualInstanceMethod(x);
Auf die Kommentare, die Sie in Ihrem Schnitt machen - Sie werden eine enorme Geschwindigkeitserhöhung mit Lösungen wie thi sehen s, weil zwischen einem dynamisch kompilierten Delegierten und einem statisch kompilierten Delegierten nur sehr wenig Unterschiede bestehen; Sobald der Overhead der Kompilierung ausgeklammert ist. Seit ich die Ausdrucksbaumstruktur "entdeckt" habe, benutze ich sie überall und würde sie wahrscheinlich als meine Nr.1 Eigenschaft von .Net 3.5 bezeichnen. In Version 4 ist es sogar noch besser, da Sie Code mit mehreren Anweisungen schreiben können, der aufgrund der vom DLR benötigten Erweiterungen benötigt wird. –