Funktionszeiger in C#

Ich nehme an, in gewisser Weise eine (oder beide) Delegate oder MethodInfo qualifizieren Sie sich für diese Titel. Jedoch, weder die syntaktische Nettigkeit, die ich Suche. Also, kurz gesagt, Ist es eine Möglichkeit, dass ich schreiben kann, die folgenden:

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

Kann ich nicht verwenden, eine solide Delegierten (also die Verwendung der delegate Schlüsselwort deklarieren Sie einen Delegaten-Typ), weil es keine Möglichkeit zu wissen, bis Laufzeit die genauen parameter Liste. Als Referenz, hier ist, was ich schon immer liebäugelt mit in LINQPad derzeit, wo B werden (meist) vom Benutzer generierten code, und so wird Main, und damit für die Feinheit meiner user, ich bin versucht zu entfernen, die .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.");
    }
}

InformationsquelleAutor Matthew Scharley | 2009-07-26

Schreibe einen Kommentar