2009-01-27 64 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(); 

它使用流暢的界面,真正簡化了這種操作。我希望你能找到它有用。