Как создать делегат для отраженного метода во время выполнения - PullRequest
5 голосов
/ 23 июня 2010

Я хочу создать Delegate отраженного метода, но для Delegate.CreateDelegate требуется указать Type делегата.Можно ли динамически создать «Делегат», который соответствует любой отраженной функции?

Вот простой пример:

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);
        }
    }
}

Обновление:

Ближайшая вещь, которую яобнаружил это FastInvokeWrapper в проекте кода, но я все еще пытаюсь обернуть его вокруг, и я не совсем понимаю, как GetMethodInvoker связывает отраженный метод с FastInvokeHandler.

1 Ответ

1 голос
/ 25 сентября 2014

Смысл этого типа оптимизации делегата-отражения заключается в том, что вы знаете, какой тип делегата вам нужен во время компиляции.Если вы приведете его к типу Delegate, как это Delegate dlg =, вам придется вызывать его с помощью метода Invoke, который является тем же отражением.

Таким образом, вы должны использовать вместо этого генерацию IL или деревья выражений для создания нейтральных делегатов, таких какFunc<object,object[],object>.

Также прочитайте это для лучшего понимания.

...