2009-01-27 12 views
2

Comment le code semble que cela créerait un objet de classe:Comment faire la création d'objet dynamique et invocation de méthode dans .NET 3.5

string myClass = "MyClass"; 

de type ci-dessus, puis appelez

string myMethod = "MyMethod"; 

Sur cet objet?

+0

Je pense que vous devez clarifier votre question. Essayez-vous de créer dynamiquement le type, c'est-à-dire, de définir dynamiquement une classe, ainsi que d'appeler dynamiquement une méthode sur ce type? – orj

Répondre

10

exemple, mais sans vérification d'erreur:

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"); 
     } 
    } 
} 

Chaque étape doit vérifier soigneusement - vous ne pouvez pas trouver le type, il peut ne pas avoir un constructeur sans paramètre, vous ne pouvez pas trouver la méthode, vous pouvez l'invoquer avec les mauvais types d'arguments. Une chose à noter: Type.GetType (string) a besoin du nom qualifié de l'assembly du type sauf s'il se trouve dans l'assembly en cours d'exécution ou mscorlib.

2

Ce qui suit suppose un objet avec un constructeur public et une méthode publique qui renvoie une certaine valeur mais ne prend aucun paramètre.

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

En supposant que votre classe se trouve dans votre assembly en cours d'exécution, votre constructeur et votre méthode sont sans paramètre.

3

J'ai créé une bibliothèque qui simplifie la création d'objet dynamique et appel à l'aide .NET, vous pouvez télécharger la bibliothèque et le code dans le code google: Late Binding Helper Dans le projet, vous trouverez un Wiki page with the usage, ou vous pouvez également vérifier article in CodeProject

En utilisant ma bibliothèque, votre exemple ressemblera à ceci:

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

Ou encore plus court:

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

Il utilise une interface fluide et simplifie vraiment ce genre d'opérations. J'espère que vous pourriez le trouver utile.