Frage

Ich möchte Methoden mit einem bestimmten Attribut aufzurufen. Also ich bin Radfahren durch alle Baugruppen und alle Methoden, die Methoden mit meinem Attribute zu finden. Funktioniert gut, aber wie rufe ich eine bestimmte Methode, wenn ich nur es ist Method.

AppDomain app = AppDomain.CurrentDomain;
Assembly[] ass = app.GetAssemblies();
Type[] types;
foreach (Assembly a in ass)
{
    types = a.GetTypes();
    foreach (Type t in types)
    {
        MethodInfo[] methods = t.GetMethods();
        foreach (MethodInfo method in methods)
        {
            // Invoke a certain method
        }
    }
}

Das Problem ist, dass ich die Instanz der Klasse nicht wissen, dass, dass bestimmte Verfahren enthält. So kann ich es nicht richtig aufrufen, da die Methoden nicht statisch sind. Ich möchte auch eine neue Instanz dieser Klasse, wenn möglich, zu schaffen vermeiden.

War es hilfreich?

Lösung

Das erscheint mir als ein Problem im Hinblick auf die Definition des Problems, anstatt Codierung.

Instanzmethoden davon abhängen, welche Instanz sie genannt werden - es macht keinen Sinn, ohne sich um eine Instanz Methode zu nennen, was es heißt auf. (Wie Martin sagt, eine Instanzmethode, die nicht, welche Instanz schert es auf sollte fast immer statisch sein genannt wird. Die einzige unmittelbare Ausnahme, die ich mir vorstellen kann hierfür ist, virtuelle Methoden, wo die Instanz gibt implizit die Implementierung zu verwenden.)

herausfinden, was es wirklich Mittel in Ihrem Kontext für dort eine kommentierte Instanzmethode zu sein. Warum versuchen Sie Methoden trotzdem aufzurufen? Was ist das größere Bild? Welcher Zusammenhang haben Sie? Ich vermute, dass Sie stark werde eine Vorstellung von einem Kontext wollen -. Eine Sammlung von Objekten, die Sie können rufen Sie die Instanzmethoden auf

Andere Tipps

Nicht-statische Methoden sind beispielsweise spezifisch, so dass Sie die Klasse instanziiert muss die Methode aufzurufen. Wenn Sie die Möglichkeit haben, den Code zu ändern, in dem sie definiert ist, und das Verfahren selbst erfordert nicht Teil einer Instanz zu sein (es hat keinen Zugriff auf oder ändern, dass nicht-statische Eigenschaften und Methoden innerhalb der Klasse), dann würde die Best Practice sein, um die Methode statisch sowieso zu machen.

Angenommen, Sie nicht statisch machen kann dann der Code, den Sie benötigen, ist wie folgt:

    foreach (Type t in types)
    {
            object instance = Activator.CreateInstance(t);

            MethodInfo[] methods = t.GetMethods();
            foreach (MethodInfo method in methods)
            {                    
                method.Invoke(instance, params...);    
            }
    }

Eigentlich, denke ich, was Sie tun müssen, ist eine Liste der vorhandenen Objekte zu erstellen und dann die Liste suchen. So wie Sie diese aufrufbaren Objekte zu erstellen, würden Sie sie in die Liste speichern (oder vielleicht sollte die Liste eine Liste von Objekten von einer anderen Art sein, die auch eine Beschreibung des aufrufbare Objekt hat). Dann können Sie die Liste zur Laufzeit scannen, finden Sie das eine, die die Art der Veranstaltung passt, welches Sie Handhabung und dann seine METHOD nachzuschlagen und rufen .Invoke über die Methode Info, unter der Annahme, das ist, was Sie tun möchten. Sie würden auch in den entsprechenden Argumenten übergeben müssen, aber Sie können das tun, indem Sie einen Vektor von Objekten der richtigen Typen zu schaffen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top