5 Stimmen

Wie man einen Delegaten für eine reflektierte Methode zur Laufzeit erstellt

Ich möchte eine Delegate einer reflektierten Methode, aber die Delegate.CreateDelegate erfordert die Type des Delegierten festgelegt werden. Ist es möglich, dynamisch einen "Delegaten" zu erstellen, der zu jeder reflektierten Funktion passt?

Hier ist ein einfaches Beispiel:

class Functions
{
    public Functions()
    {

    }

    public double GPZeroParam()
    {
        return 0.0;
    }

    public double GPOneParam(double paramOne)
    {
        return paramOne;
    }

    public double GPTwoParam(double paramOne, double paramTwo)
    {
        return paramOne+paramTwo;
    }
}

static void Main(string[] args)
{
    Dictionary<int, List<Delegate>> reflectedDelegates = new Dictionary<int, List<Delegate>>();
    Functions fn = new Functions();
    Type typeFn = fn.GetType();
    MethodInfo[] methods = typeFn.GetMethods();

    foreach (MethodInfo method in methods)
    {
        if (method.Name.StartsWith("GP"))
        {
            ParameterInfo[] pi = method.GetParameters();

            if (!reflectedDelegates.ContainsKey(pi.Length))
            {
                reflectedDelegates.Add(pi.Length, new List<Delegate>());
            }

            // How can I define a delegate type for the reflected method at run time?
            Delegate dlg = Delegate.CreateDelegate(typeof(???), fn, method);
            reflectedDelegates[pi.Length].Add(dlg);
        }
    }
}

Aktualisierung:

Am ehesten habe ich das hier gefunden FastInvokeWrapper auf code-project, aber ich versuche immer noch, es zu verstehen, und ich verstehe nicht ganz, wie GetMethodInvoker bindet die reflektierte Methode an die FastInvokeHandler .

1voto

Vlad Punkte 2810

Der Sinn dieser Art von Delegate-Reflection-Optimierung besteht darin, dass Sie zur Kompilierungszeit wissen, welche Art von Delegat Sie benötigen. Wenn Sie ihn auf den Typ Delegate wie diese Delegate dlg = müssen Sie es mit der Invoke-Methode aufrufen, die die gleiche Reflexion ist.

Daher sollten Sie stattdessen die IL-Generierung oder Expression Trees verwenden, um neutrale Delegierte wie Func<object,object[],object> .

Lesen Sie auch diese zum besseren Verständnis.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X