GUID является реализацией Microsoft стандарта UUID.
На Википедия :
термин GUID обычно относится к реализации Microsoft Универсально Уникальный идентификатор (UUID) стандарт.
обновленная кавычка из той же самой статьи Wikipedia:
сам RFC 4122 указывает, что UUID "также известны как GUID". Все это предполагает, что "GUID", при исходном обращении к варианту UUID, используемого Microsoft, стал просто альтернативным названием UUID†¦
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; }
}
Если вы заранее не знаете количество или тип параметров, вероятно, это означает, что вы не знаете, какой тип делегата вы хотите создать?
Если это так, вы застряли в абсолютно общем случае.
Однако для большинства общих случаев (без параметров 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
должен работать.
У меня нет времени для работы над примером прямо сейчас, но позвольте я знаю, если вы хотите, чтобы я сказал позже.
Один вопрос: как вы собираетесь использовать этого делегата? Кто-то еще должен знать, как это выполнить, конечно ...