Указатели на функции в C #

Я полагаю, в некотором смысле либо (или оба)Delegate или жеMethodInfo претендовать на этот титул. Однако ни тот, ни другой не обеспечивают синтаксическую привлекательность, которую я ищу. Итак, вкратце, есть ли способ, которым я могу написать следующее:

FunctionPointer foo = // whatever, create the function pointer using mechanisms
foo();

Я не могу использовать твердый делегат (т. Е. Используяdelegate ключевое слово для объявления типа делегата), поскольку нет способа узнать до времени выполнения точный список параметров. Для справки вот то, с чем я в данный момент играю в LINQPad, гдеB будет (в основном) пользовательский код, и так будетMainи, следовательно, для удобства моих пользователей я пытаюсь удалить.Call:

void Main()
{
    A foo = new B();
    foo["SomeFuntion"].Call();
}

// Define other methods and classes here
interface IFunction {
    void Call();
    void Call(params object[] parameters);
}

class A {
    private class Function : IFunction {
        private MethodInfo _mi;
        private A _this;
        public Function(A @this, MethodInfo mi) {
            _mi = mi;
            _this = @this;
        }

        public void Call() { Call(null); }
        public void Call(params object[] parameters) {
            _mi.Invoke(_this, parameters);
        }
    }

    Dictionary<string, MethodInfo> functions = new Dictionary<string, MethodInfo>();

    public A() {
        List<MethodInfo> ml = new List<MethodInfo>(this.GetType().GetMethods());
        foreach (MethodInfo mi in typeof(Object).GetMethods())
        {
            for (int i = 0; i < ml.Count; i++)
            {
                if (ml[i].Name == mi.Name)
                    ml.RemoveAt(i);
            }
        }

        foreach (MethodInfo mi in ml)
        {
            functions[mi.Name] = mi;
        }
    }

    public IFunction this[string function] {
        get { 
            if (!functions.ContainsKey(function))
                throw new ArgumentException();

            return new Function(this, functions[function]);
        }
    }
}

sealed class B : A {
    public void SomeFuntion() {
        Console.WriteLine("SomeFunction called.");
    }
}

Ответы на вопрос(2)

Ваш ответ на вопрос