Frage

Wie funktioniert der Code das sieht ein Objekt der Klasse erstellen würde:

string myClass = "MyClass";

Von der oben genannten Art, und rufen Sie dann

string myMethod = "MyMethod";

An diesem Objekt?

War es hilfreich?

Lösung

Beispiel, aber ohne Fehlerprüfung:

using System;
using System.Reflection;

namespace Foo
{
    class Test
    {
        static void Main()
        {
            Type type = Type.GetType("Foo.MyClass");
            object instance = Activator.CreateInstance(type);
            MethodInfo method = type.GetMethod("MyMethod");
            method.Invoke(instance, null);
        }
    }

    class MyClass
    {
        public void MyMethod()
        {
            Console.WriteLine("In MyClass.MyMethod");
        }
    }
}

Jeder Schritt muss sorgfältiger Prüfung -. Sie nicht die Art finden kann, kann es nicht einen parameterlosen Konstruktor haben, können Sie die Methode nicht finden können, können Sie es mit den falschen Argumenttypen aufrufen kann

Eine Sache zu beachten: Type.GetType (string) muss die Assembly qualifizierten Namen des Typs, wenn sie in der aktuell ausgeführten Assembly oder mscorlib ist

.

Andere Tipps

Ich habe eine Bibliothek erstellt, die .NET-Erstellung und Aufruf dynamische Objekt vereinfacht können Sie die Bibliothek herunterladen und den Code in Google Code: Späte Bindung Helper In dem Projekt finden Sie eine Wiki-Seite mit der Nutzung finden, oder Sie können überprüfen Sie auch diese Artikel Codeproject

Mit meiner Bibliothek, Ihr Beispiel wird wie folgt aussehen:

IOperationInvoker myClass = BindingFactory.CreateObjectBinding("MyClassAssembly", "MyClass");
myClass.Method("MyMethod").Invoke();

Oder noch kürzer:

BindingFactory.CreateObjectBinding("MyClassAssembly", "MyClass")
     .Method("MyMethod")
     .Invoke();

Es verwendet eine fließend Schnittstelle und vereinfacht wirklich diese Art von Operationen. Ich hoffe, Sie könnte es nützlich finden.

Im Folgenden wird angenommen, ein Objekt mit einem öffentlichen Konstruktor und einer öffentlichen Methode, die einen Wert zurückgibt, aber keine Parameter.

var object = Activator.CreateInstance( "MyClass" );
var result = object.GetType().GetMethod( "MyMethod" ).Invoke( object, null );

Unter der Annahme, dass Ihre Klasse in Ihrer Ausführung Baugruppe ist, Konstruktor und Ihre Methode ist parameterlos.

Type clazz = System.Reflection.Assembly.GetExecutingAssembly().GetType("MyClass");

System.Reflection.ConstructorInfo ci = clazz.GetConstructor(new Type[] { });
object instance = ci.Invoke(null); /* Send parameters instead of null here */

System.Reflection.MethodInfo mi = clazz.GetMethod("MyMethod");
mi.Invoke(instance, null); /* Send parameters instead of null here */
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top