Делегаты - это ссылочные типы, которые инкапсулируют функцию, поэтому по сути они являются указателями на функции.
Мне кажется, что вы пытаетесь создать своего рода репозиторий функций.Если все функции будут соответствовать сигнатуре Func, используйте это и не используйте универсальный класс Delegate.
В качестве альтернативы, если вы хотите хранить все различные типы делегатов с разными сигнатурами, используя класс Delegate, вам, вероятно, следует использовать метод .DynamicInvoke (), а вместо MethodInfo в качестве ключа используйте нечто более простое, например строкуили возвращаемое значение функции, или некоторая их комбинация.
Вот простой пример того, что я имею в виду с различными методами для LookUp,
class FunctionRepository : List<Delegate> // could also be a Dictionary<,>
{
public R Invoke<R>(string name, params object[] args)
{
var _delegate = this.Single(x => x.Method.ReturnType == typeof(R)
&& x.Method.Name == name);
return (R)_delegate.DynamicInvoke(args);
}
public Func<R> LookUp<R>(string name, params object[] args)
{
var _delegate = this.Single(x => x.Method.ReturnType == typeof(R)
&& x.Method.Name == name);
return () => (R)_delegate.DynamicInvoke(args);
}
public Func<Object[], R> LookUp<R>(string name)
{
var _delegate = this.Single(x => x.Method.ReturnType == typeof(R)
&& x.Method.Name == name);
return (args) => (R)_delegate.DynamicInvoke(args);
}
}