Можете ли вы передать делегату Func <> параметр с динамическим именем?метод ( "FuncdelegateNameOfMethod") - PullRequest
0 голосов
/ 26 апреля 2019

Вы можете передать метод в другой метод, который принимает Func <>.Но можете ли вы передать это как динамически именованную строку, чтобы вы могли узнать, какой метод передается на лету?

1 Ответ

2 голосов
/ 26 апреля 2019

Вы можете передать метод в другой метод, который принимает Func<>.

Стоит отделить «передачу значения» от «создания значения в первую очередь». Когда вы пишете код, такой как:

InvokeSomeDelegate(MethodToInvoke);

Выполняет преобразование группы методов для создания экземпляра делегата. Другими словами, это эквивалентно:

Func<Whatever> func = MethodToInvoke;
InvokeSomeDelegate(func);

Так что на самом деле вопрос не столько в том, как передать строку в метод, сколько в том, как создать делегат на основе строки. Это, в свою очередь, приводит к вопросу о том, какой метод, какой тип и т. Д.

Метод каркаса, который вы хотите использовать, - Delegate.CreateDelegate, но как именно вы его используете, будет зависеть от контекста, так что вы сможете найти правильный MethodInfo с отражением. Вот пример:

using System;
using System.Reflection;

class Test
{
    static void Main()
    {
        InvokeFunc("Double");
        InvokeFunc("Quadruple");
        InvokeFunc("AddOne");
    }

    static void InvokeFunc(string name)
    {
        // Note that in our case they're all private static methods. You'd
        // need to adjust the binding flags if that's not the case. If you
        // need to worry about multiple overloads, that makes it harder too.
        MethodInfo method = typeof(Test)
            .GetMethod(name, BindingFlags.NonPublic | BindingFlags.Static);
        // TODO: Validate that you've got a method
        var func = (Func<int, int>) Delegate.CreateDelegate(
            typeof(Func<int, int>), // Delegate type to create                                                            
            null, // Target of method call; null because ours are static
            method); // Method to create a delegate for
        var result = func(10);
        Console.WriteLine($"{name}(10) => {result}");
    }

    static int Double(int x) => x * 2;
    static int Quadruple(int x) => x * 4;
    static int AddOne(int x) => x + 1;
}

Обратите внимание, что все размышления о том, чтобы найти метод и затем создать делегата, относительно медленны. Если вы делаете это с какими-либо существенными ограничениями производительности, вы можете добавить кеширование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...