2012-02-14 39 views
15
Type.GetType("TheClass"); 

返回null如果namespace不存在这样的:避免在Type.GetType(给予命名空间名称)

Type.GetType("SomeNamespace.TheClass"); // returns a Type object 

有什么办法,以避免给namespace名字?

+4

您是否意识到,您可以在项目中添加多个名为TheClass的多个不同的类,其中添加了许多引用,并且尝试解析类型的文件有很多使用语句?您应该传递完全限定名称,包括命名空间,就像您在写入名字和姓氏的文档中引用自己时一样。编译器在许多TheClass类中应该使用哪个类以防出现多个类?命名空间告诉哪一个。 – 2012-02-14 08:20:08

+0

我会抛出'ArgumentException'而不是仅仅返回'null'。你不能区分没有'命名空间' – gdoron 2012-02-14 08:26:39

+0

可能重复[从类型的部分名称获取System.Type](http://stackoverflow.com/questions/179102/getting-a-system-type-from-types-partial -name) – nawfal 2014-08-19 07:35:09

回答

-1

这是方法期望得到的参数,所以不是。你不能。

typeName:由其名称空间限定的类型名称。

MSDN

你怎么能指望具有相同名称但不同的命名空间两个类之间的区别?

namespace one 
{ 
    public class TheClass 
    { 
    } 
} 

namespace two 
{ 
    public class TheClass 
    { 
    } 
} 

Type.GetType("TheClass") // Which?! 
+0

根据我的需要,没有像这样的情况。 – 2012-02-14 08:27:29

+0

根据我的需要,不会有这样的情况。所以在那种情况下我该怎么办呢? – 2012-02-14 08:27:37

+4

@NIleshLanke,我希望你认识到,微软并没有根据你的**需求设计.NET框架,而是将它设计为用于更广泛的场景。例如,在两个不同名称空间中具有相同类名的情况。 – 2012-02-14 08:45:31

39

我使用的是搜索所有加载Assembly■对于Type匹配指定名称的helper方法。即使在我的代码中只有一个类型结果是预期的,它支持多个。我验证每次使用它时只返回一个结果,并建议您也这样做。

/// <summary> 
/// Gets a all Type instances matching the specified class name with just non-namespace qualified class name. 
/// </summary> 
/// <param name="className">Name of the class sought.</param> 
/// <returns>Types that have the class name specified. They may not be in the same namespace.</returns> 
public static Type[] getTypeByName(string className) 
{ 
    List<Type> returnVal = new List<Type>(); 

    foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies()) 
    { 
     Type[] assemblyTypes = a.GetTypes(); 
     for (int j = 0; j < assemblyTypes.Length; j++) 
     { 
      if (assemblyTypes[j].Name == className) 
      { 
       returnVal.Add(assemblyTypes[j]); 
      } 
     } 
    } 

    return returnVal.ToArray(); 
} 
+19

+1回答这个问题,而不是堆在上面的火焰战争。 – 2013-08-29 18:49:48

+2

另一个答案,是从谁知道,而不是不使用命名空间bla bla :) ty的答案 – MonsterMMORPG 2016-03-01 10:52:49

+0

太棒了,做它说什么。我会添加到这个主要的事情是使用assemblyTypes [j] .Name.EqualsIgnoreCase(className)。 – sirthomas 2017-02-09 01:04:59

相关问题