2009-09-08 18 views
12

創建C#類,我想從類型全名的Type對象我做了如下因素:從全名

Assembly asm = Assembly.GetEntryAssembly(); 
string toNativeTypeName="any type full name"; 
Type t = asm.GetType(toNativeTypeName); 

我得到空的,爲什麼?

大會是我的可執行文件(.NET可執行程序)和類型名稱是:System.Xml.XmlNode

+0

向我們展示你的全名是什麼意思? – AnthonyWJones 2009-09-08 08:49:23

+0

該程序集是我的可執行文件(.net可執行文件),類型名稱爲:System.Xml.XmlNode – 2009-09-08 08:53:41

+0

System.Xml.XmlNode在您的程序集中不存在,因此您應該使用Type.GetType而不是Assembly.GetType。 – 2009-09-08 08:56:08

回答

27

好吧,如果這真的是該類型的全名(即包括命名空間),它是在組裝,那麼它應該工作。你可以舉一個例子嗎?由於您使用的是Assembly.GetType而不是Type.GetType,因此您的不應包含類型名稱中的程序集名稱。

請注意,泛型類型的名稱不是您所期望的名稱。舉例來說,你會使用:

assembly.GetType("System.Collections.Generic.List`1"); 

得到泛型列表類型,然後使用Type.MakeGenericType提供類型參數。

當然,這隻在類型是通用的時纔有意義。如果這不是問題,我會仔細檢查該類型是否在您的輸入程序集中。

編輯:哦,要知道,嵌套類型將是「集裝箱+嵌套」,而不是「Container.Nested」如果這是有關...

+0

程序集是我的可執行文件(.net可執行文件),類型名稱是:System.Xml.XmlNode – 2009-09-08 08:53:05

+4

然後就是這樣的問題:System.Xml.XmlNode不是你的程序集中的類型,是嗎?您需要使用正確的程序集,或者使用完整的程序集信息調用Type.GetType。 – 2009-09-08 09:21:34

+0

+1這裏有很多很好的信息。 – 2010-04-17 00:08:49

4

你的類型名稱很可能是錯誤的。如果您在代碼中創建對類型的引用,然後檢查其屬性Type.FullName,您將看到該類型的名稱應如何顯示。

你也可以嘗試Type.GetType方法,看看它返回什麼。也許你的類型根本不在該程序集中?

編輯: 事實證明,我使用Type.FullName屬性是錯誤的。如果使用Type.AssemblyQualifiedName屬性,您將獲得可由Type.GetType使用的完全限定名稱。

對於System.Xml.XmlNode您會收到以下名字:System.Xml.XmlElement, System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

6

爲什麼要定義組件使用獲取類型!你也需要把命名空間

string toNativeTypeName = "System.Int32"; 
Type t = Type.GetType(toNativeTypeName); 
MessageBox.Show(t.FullName); 
+3

如果您知道入口程序集中的*類型爲*,那麼使用Assembly.GetType以及包含名稱空間的名稱,但不包含程序集名稱可能比包含完整程序集名稱(包括版本)要容易得多... – 2009-09-08 08:53:32

+0

這幫了我。我試圖從序列中提取序列化的消息。我正在用System.String進行測試,並且在從當前域中遍歷所有程序集時沒有找到它。當我改變使用Type.GetType時,它只是工作。謝謝你的提示。 – fizch 2017-03-08 18:54:18

3

我碰到這個線程來了並注意到原來的問題還沒有完全回答。我可能是錯的,但在閱讀這個問題時,我認爲作者的意圖是能夠簡單地從被引用或是您的應用程序的一部分的程序集中獲取類型。

下面是我做了什麼來解決這個問題。

public static Type GetTypeFromFullName(string fullClassName) 
{ 
    AssemblyPartCollection parts = Deployment.Current.Parts; 

    foreach (var part in parts) 
    { 
     Uri resUri = new Uri(part.Source, UriKind.Relative); 
     Stream resStream = Application.GetResourceStream(resUri).Stream; 
     Assembly resAssembly = part.Load(resStream); 
     Type tryType = resAssembly.GetType(fullClassName, false); 
     if (tryType != null) 
      return tryType; 
    } 

    return null; 
} 
8

見下面我的建議,只有循環業務命名空間速度

private static Type GetBusinessEntityType(string typeName) 
{ 
    Debug.Assert(typeName != null); 

    List<System.Reflection.Assembly> assemblies = AppDomain.CurrentDomain.GetAssemblies() 
     .Where(a => a.FullName.StartsWith("AF.BusinessEntities")).ToList(); 

    foreach (var assembly in assemblies) 
    { 
     Type t = assembly.GetType(typeName, false); 
     if (t != null) 
      return t; 
    } 
    throw new ArgumentException(
     "Type " + typeName + " doesn't exist in the current app domain"); 
} 

這裏是另一種方式來做到這一點:

Type t = System.Web.Compilation.BuildManager.GetType("the.type", true, false); 

使用反射來看看它是如何做的,至少有趣:)

+1

'System.Web.Compilation.BuildManager'爲我做了,另一個我沒有得到它爲Enum工作:'NLibrary + Modules' – Niels 2014-06-26 12:35:31