2013-04-27 205 views
3

我正在使用C#開發移動應用程序(Monotouch,monodroid)。 我有一個類通過這樣的定義:從C#中的字符串名稱獲取Class對象#

public class TempIOAddOn : BaseIOAddOn 
{ 
    public TempIOAddOn() 
    { 
    } 
} 

我使用此代碼通過字符串名來訪問類的一個實例:

BaseIOAddOn tempIOAddOn; 
      Type t= Type.GetType("TempIOAddOn"); 
      tempIOAddOn = (BaseIOAddOn)Activator.CreateInstance(t); 

但executation後,tnull

我嘗試下面的代碼也:

BaseIOAddOn tempIOAddOn; 
      tempIOAddOn = (BaseIOAddOn)System.Reflection.Assembly.GetExecutingAssembly().CreateInstance("TempIOAddOn"); 

但我再次面對nulltempIOAddOnnull

我怎麼了?

+2

嘗試使用[大會限定名稱(http://msdn.microsoft.com/en-us/library/system.type .assemblyqualifiedname.aspx)。如果它正在運行Xamarin,它可能需要全限定名稱。我對Silverlight有同樣的限制。 – 2013-04-27 11:46:37

+0

[從類型的部分名稱獲取System.Type]的可能重複(http://stackoverflow.com/questions/179102/getting-a-system-type-from-types-partial-name)**和** [type-gettypenamespace-ab-classname-returns-null](http://stackoverflow.com/questions/1825147/type-gettypenamespace-ab-classname-returns-null) – nawfal 2013-12-05 19:37:35

回答

5

請嘗試使用Assembly Qualified Name代替。如果它正在運行Xamarin,那麼可能需要使用全限定名稱。我對Silverlight有同樣的限制。

儘快獲得全名,只是引用類型和輸出它:

Console.WriteLine(typeof(TempIOAddon).AssemblyQualifiedName); 

編輯:下面是MSDN文檔爲Type.GetType(string)爲Silverlight。由於Xamarin的移動平臺或多或少基於關閉它,一般的文檔可以申請:http://msdn.microsoft.com/en-us/library/w3f99sx1%28v=vs.95%29.aspx

需要注意的是,如果可能的類型是在當前執行的程序集,你可能只需要完整的namespace.name

+0

感謝您的答覆,它工作。 – 2013-04-27 12:04:13

7

您的課程幾乎肯定包含在名稱空間中。在這種情況下你需要它的命名空間限定的類型名稱:

Type t= Type.GetType("MyNamespace.TempIOAddOn"); 
+0

感謝您的回覆。兩個答案都是正確的,只是可以選擇一個作爲答案。相反,1 upvote爲清楚的答案。 – 2013-04-27 12:05:09