Punteros de función en C #

Supongo que de alguna manera cualquiera (o ambas)Delegate oMethodInfo Califica para este título. Sin embargo, ninguno de los dos proporciona la amabilidad sintáctica que estoy buscando. Entonces, en resumen, ¿hay alguna manera de que pueda escribir lo siguiente:

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

No puedo usar un delegado sólido (es decir, usando eldelegate palabra clave para declarar un tipo de delegado) porque no hay forma de saber hasta el tiempo de ejecución la lista exacta de parámetros. Para referencia, esto es lo que he estado jugando en LINQPad actualmente, dondeB será (en su mayoría) código generado por el usuario, y también lo seráMain, y por lo tanto para la amabilidad de mis usuarios, estoy tratando de eliminar el.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.");
    }
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta