Создает делегата из MethodInfo?

GUID является реализацией Microsoft стандарта UUID.

На Википедия :

термин GUID обычно относится к реализации Microsoft Универсально Уникальный идентификатор (UUID) стандарт.

обновленная кавычка из той же самой статьи Wikipedia:

сам RFC 4122 указывает, что UUID "также известны как GUID". Все это предполагает, что "GUID", при исходном обращении к варианту UUID, используемого Microsoft, стал просто альтернативным названием UUID†¦

32
задан Community 23 May 2017 в 12:01
поделиться

2 ответа

To be honest, if you don't know the type at compile time, there isn't a huge amount of benefit in creating a Delegate. You don't want to use DynamicInvoke; it will be about as slow as reflection. The main exception to this is when there is a delegate-type lurking in the shadows, for example when subscribing to an event - in which case EventInfo makes this available.

For info, in .NET 3.5 on Expression, there is:

Expression.GetActionType(params Type[] typeArgs);
Expression.GetFuncType(params Type[] typeArgs)

That might help to an extent:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
static class Program {
    static void Main() {
        DoStuff("Test1");
        DoStuff("Test2");
    }
    static void DoStuff(string methodName) {
        MethodInfo method = typeof(Program).GetMethod(methodName);
        List<Type> args = new List<Type>(
            method.GetParameters().Select(p => p.ParameterType));
        Type delegateType;
        if (method.ReturnType == typeof(void)) {
            delegateType = Expression.GetActionType(args.ToArray());
        } else {
            args.Add(method.ReturnType);
            delegateType = Expression.GetFuncType(args.ToArray());
        }
        Delegate d = Delegate.CreateDelegate(delegateType, null, method);
        Console.WriteLine(d);
    }
    public static void Test1(int i, DateTime when) { }
    public static float Test2(string x) { return 0; }
}
22
ответ дан 27 November 2019 в 21:08
поделиться

Если вы заранее не знаете количество или тип параметров, вероятно, это означает, что вы не знаете, какой тип делегата вы хотите создать?

Если это так, вы застряли в абсолютно общем случае.

Однако для большинства общих случаев (без параметров ref / out, мало параметров для использования одного из существующих типов) вам может сойти с рук один из делегирует Func или Action . (.NET 4.0 имеет типы Func / Action для огромного количества параметров, так что на самом деле вам нужно беспокоиться только о параметрах out / ref.) Если метод имеет не- void возвращаемый тип используйте Func , в противном случае используйте Action . Определите, какой тип использовать, исходя из количества параметров, например

static readonly Type[] FuncTypes = { typeof(Func), 
    typeof(Func<>), typeof(Func<,>), typeof(Func<,,>), /* etc */ };

Используйте Тип. MakeGenericType с использованием типов параметров и возвращаемого типа для получения правильного типа делегата, тогда Delegate.CreateDelegate должен работать.

У меня нет времени для работы над примером прямо сейчас, но позвольте я знаю, если вы хотите, чтобы я сказал позже.

Один вопрос: как вы собираетесь использовать этого делегата? Кто-то еще должен знать, как это выполнить, конечно ...

7
ответ дан 27 November 2019 в 21:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: