Frage

Ich habe Reflexion zu tun, und die späte Bindung, so dass ich weiß nicht, ob es einen Weg gibt, um Dinge zu beschleunigen. Dachte, ich würde es einen Schuss.

Dieser Code-Schnipsel dauert etwa 15 Sekunden abgeschlossen, welchen Weg zu langsam, aber zu sehen, wie ich brauche, um die Metadaten zu lesen.

private static object InvokeCall(Type HostObjectType, Object HostObject, CallType callType, string PropertyOrMethodName, object[] args)
{
    if (callType == CallType.Method)
    {
        return MyObjectType.InvokeMember(PropertyOrMethodName,System.Reflection.BindingFlags.InvokeMethod, null, myObject, args);
    }
}
War es hilfreich?

Lösung

Ich gehe davon aus, dass 15s wird, wenn in einer Schleife verwendet wird; Reflexion ist nicht , die langsam.

Sie können Reflexion (und invoke insbesondere) beschleunigen, indem die Method zu erhalten und mit Delegate.CreateDelegate einmal . Sie dann Cache und Wiederverwendung der resultierenden getippt Delegierten (die erwartete Anruf Signatur entspricht). Dann nutzen Sie die typisierten Delegaten aufrufen.

Hinweis nicht typisierten Delegaten invoke ist langsam; es muss eingegeben werden. Ebenfalls; Sie können einen Delegaten sein mit einem zusätzlichen (führenden) Parameter eine Instanz Verfahren gegen eine Reihe von verschiedenen Objekten hinterhältig und verwenden aufzurufen, wenn Sie das Zielobjekt zu ändern pro Anruf müssen.

Für komplexere Szenarien, Expression oder Dynamic sind nützlich.

scroll top