2012-10-05 138 views
3

我是全新的反射,我試圖從一個數據庫記錄調用類名,然後加載類並運行它,但我拉我的發出我要去哪裏的錯誤,它可能是我失蹤的真正愚蠢的東西。使用「新」關鍵字創建一個對象使用反射

作爲一個例子,我有我的課在一個不同的項目和腳本文件夾,然後從數據庫記錄調用它的名稱。

className = String.Format("Utilities.Scripts.{0}", script.ScriptClass); 

然後在我的主程序我有

// Get a type from the string 
Type type = Type.GetType(className); 

// Create an instance of that type 
Object obj = Activator.CreateInstance(type); 

// Retrieve the method you are looking for 
MethodInfo methodInfo = type.GetMethod("start"); 

// Invoke the method on the instance we created above 
methodInfo.Invoke(obj, null); 

但我得到的錯誤調試時,我可以看到我的信息傳遞到的GetType(類名),但沒有通過的類型去和就像這樣進入obj那裏它是錯誤的。

+0

你能發佈你確切的錯誤嗎? –

+0

System.ArgumentNullException - {「值不能爲空。\ r \ n參數名稱:type」} 謝謝 – Adamsk1

+0

使用調試程序遍歷代碼並找出使用空參數調用的方法。然後,讓它們不爲空。我的第一個猜測是將methodInfo.Invoke()的第二個參數設爲空數組而不是null。 –

回答

3

您需要提供該類型的Assembly Qualified Name(如提到here),因爲該類位於不同的項目中。另外,請確保您嘗試加載類型的程序集與試圖加載該程序集的程序集位於相同的文件夾中,或者位於GAC中。

對於如下文所定義的類:

namespace Foo.Bar 
{ 
    public class Class1 
    { 

    } 
} 

完整的類名是Foo.Bar.Class1。裝配限定名稱還指定裝配的全名,如Foo.Bar.Class1, Foo.Bar, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35。你可以找到你的類型的裝配合格的名稱中包含財產以後:

Console.WriteLine(typeof(Foo.Bar.Class1).AssemblyQualifiedName) 
+0

這不是我所做的,雖然通過放入項目,子文件夾,然後類名作爲類型? 「Utilities.Scripts。{0}」,script.ScriptClass」 調試時,這是顯示正常,但你將鼠標懸停在類型和它沒有什麼? 感謝 – Adamsk1

+1

沒有,大會合格的名稱之間的關係, ProjectName.Folder.ClassName是偶然的,我將編輯我的答案,以更清晰地定義程序集限定名。 –

+0

好了!解決了我的問題,並加載了我的2個測試類,如果我更改了數據庫排序,非常感謝:-) – Adamsk1

0

的問題是在這條線:

Type type = Type.GetType(className); 

在該方法的這種特殊的重載不會拋出異常時類型無法解析。相反,使用this overload需要2個布爾值,其中之一是throwOnError。爲該參數傳遞真實,你會得到一個異常,應該可以幫助您調試爲什麼你的類型cannnot從你把這個字符串來解決。

我懷疑你需要一個類名集名稱

Utilities.Scripts.SomeClass, SomeAssemblyName 
相關問題