2011-03-12 43 views
4

我已經看到了這個主題:Creating an instance from a class name如何獲得給定類名的類的實例?

,寫這樣的代碼:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     object obj = Activator.CreateInstance(null, "MyClass"); 

     MyClass t = (MyClass)obj; 
     t.My1 = 100; 
     MessageBox.Show(t.My1.ToString()); 
    } 
} 

public class MyClass 
{ 
    public int My1 { get; set; } 
    public int My2 { get; set; } 
} 

然而,當它的運行有一個例外:

Could not load type 'MyClass' from assembly 'Test_Reflection, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. 

我有另外一個問題。我在一個有一些財產的集會上有一堂課。在另一個程序集中,我想創建它的實例並通過使用stringy類名稱輸入其中的一個來訪問它的屬性。我怎樣才能做到這一點?

+1

您確定您確實在閱讀您鏈接的答案嗎? – Jon 2011-03-12 13:02:44

+2

嘗試指定名稱空間。 – 2011-03-12 13:04:14

+0

是的,我傳入null,因爲MyClass在Current Assembly中找到 – Arian 2011-03-12 13:05:11

回答

9

根據MSDNnull實際上並不意味着當前程序集。這意味着組裝將被搜索(當你的課程位於另一個組裝中時)。你也需要指定類名。因此,爲了防止搜索並獲得正確輸入你需要寫全assembly-qualified name:您可以檢索例如用下面的代碼

Type objType = Type.GetType("YourNamespace.MyClass, YourAssemblyName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"); 
object obj = Activator.CreateInstance(objType); 
MyClass t = (MyClass)obj; 

大會限定的名稱(檢查你是不是弄錯):

string name = typeof(MyClass).AssemblyQualifiedName; 
+0

其實它(只要當前==執行?)。如果assemblyName爲null,則搜索正在執行的程序集。 – 2011-03-12 13:24:34

+0

前兩句對我來說沒有意義。你能澄清嗎?如果它不代表目前的組裝,這是什麼意思? – 2011-03-12 13:42:36

+0

@Ritch Melton,當MyClass位於當前程序集中時 - 無論如何編寫。但是當你需要使用另一個程序集的類時,'null'會導致搜索該程序集。更明確地指定它。 – 2011-03-12 13:47:27

0

您只需將名稱空間預先添加到類名稱即可。在一個console exe項目中,這對我很有用。您確實遇到了使用返回對象句柄的問題。它不是一個對象,而是一個ObjectHandle,你需要調用Unwrap()獲取實際的類型實例。

namespace CSharpConsoleTest 
{ 
    public class MyClass 
    { 
     public int My1 { get; set; } 
     public int My2 { get; set; } 
    } 

    public class Program 
    { 
     public static void Main(string[] args) 
     { 
      var obj = Activator.CreateInstance(null, "CSharpConsoleTests.MyClass"); 

      var t = (MyClass)obj.Unwrap(); 
      t.My1 = 100; 
      MessageBox.Show(t.My1.ToString()); 
     } 
    } 
} 
+0

....完全限定的命名空間順便說一句。 – 2011-03-12 13:26:59