2009-01-27 65 views
2

如何代码看起来将创造类的一个对象:如何做到在.NET动态对象的创建和方法调用3.5

string myClass = "MyClass"; 

上述类型的,然后调用

string myMethod = "MyMethod"; 

关于那个对象?

+0

我认为你需要澄清你的问题。你是否试图动态创建类型,即动态定义一个类,以及动态调用该类型的方法? – orj 2009-01-27 12:38:15

回答

10

例,但没有错误检查:

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

每一步都需要仔细检查 - 你可能找不到类型,它可能没有一个无参数的构造函数,你可能找不到这个方法,你可能会用错误的参数类型来调用它。

需要注意的一件事:Type.GetType(string)需要该类型的程序集限定名称,除非它在当前正在执行的程序集或mscorlib中。

2

以下内容假定具有公共构造函数和返回某个值但不带参数的公共方法的对象。

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

假设你的类在你的执行程序集中,你的构造函数和方法是无参数的。

3

我已经创建了简化了使用.NET你可以下载库,并在谷歌代码的代码动态对象创建和调用库:Late Binding Helper 在项目中,你会发现一个Wiki page with the usage,或者你也可以检查这个article in CodeProject

使用我的图书馆,你的例子是这样的:

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

或者更短:

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

它使用流畅的界面,真正简化了这种操作。我希望你能找到它有用。