Funktionszeiger in C #

Ich nehme in gewisser Weise an, entweder (oder beides)Delegate oderMethodInfo qualifizieren sich für diesen Titel. Weder bieten jedoch die syntaktische Nizza, die ich suche. Also, kurz gesagt, gibt es eine Möglichkeit, wie ich Folgendes schreiben kann:

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

Ich kann keinen festen Stellvertreter verwenden (z. B. mit demdelegate Schlüsselwort zum Deklarieren eines Delegattyps), da es bis zur Laufzeit keine Möglichkeit gibt, die genaue Parameterliste zu ermitteln. Als Referenz, hier ist, womit ich gerade in LINQPad gespielt habe, woB wird (meistens) benutzergenerierter Code sein, und das wird es auchMain, und daher für die Freundlichkeit meiner Benutzer, versuche ich, die zu entfernen.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.");
    }
}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage