如何获得程序集的命名空间?

时间:2009-03-17 05:53:29

标签: c# .net assemblies namespaces

考虑我有一个汇编(类库dll),我使用以下代码

加载了它
Assembly a = Assembly.LoadFrom(@"C:\Documents and Settings\E454935\My Documents\Visual Studio 2005\Projects\nunit_dll_hutt\for_hutt_proj\bin\Debug\asdf.dll");   

我需要获得大会的类型。为了获得类型,我需要程序集的命名空间。

Type t = asm.GetType("NAMESPACE.CLASSNAME",false,true);             

如何在上面的行中获取命名空间。?!为了获得命名空间,我需要获取类型..?

Type.Namespace;

,即我需要获取可用于获取其类型的程序集的命名空间。

提前致谢

7 个答案:

答案 0 :(得分:33)

使用Assembly.GetTypes() - 这将为您提供所有类型的集合,然后您可以获取每个类型的Namespace属性。

然后我猜你可以简单地检查所有类型是否具有相同的Namespace值并使用此值。否则添加一些其他逻辑来检测哪些命名空间被认为是主要的。

答案 1 :(得分:22)

程序集可以包含多个名称空间。我想你真正想问的是如何在不指定命名空间的情况下从程序集中获取类型。

我不知道是否有更好的方法,但你可以尝试寻找这样的特定类型(添加 - 使用linq;):

myassembly.GetTypes().SingleOrDefault(t => t.Name == "ClassName")

如果在不同的名称空间下有超过1个具有该名称的类,这将有效地抛出(因为Single方法确保只有1个)。

有关该类的命名空间列表,您可以:

Assembly.Load("ClassName").GetTypes().Select(t => t.Namespace).Distinct();

答案 2 :(得分:16)

<强> 更新

IF assembly name &amp;项目中 assembly namespace 相同,您确定要保持主题相同 AND 您想要获取当前执行的命名空间大会 然后你可以使用它:

var namespace = Assembly.GetExecutingAssembly().GetName().Name;

对于你加载的程序集:

var namespace = myAssembly.GetName().Name;

IF assembly name&amp;您的项目中assembly namespace 不是相同,那么您可以这样使用:

// Like @eglasius answer >>
// Find all namespaces in the target assembly where a class with the following name is exists:
var namespaceList=Assembly.Load("MyClassName").GetTypes().Select(t => t.Namespace).Distinct();

答案 3 :(得分:1)

使用Mono / Xamarin,您无法访问&#34; NameSpace&#34;属性。您可以使用以下代码:

var str = typeof(ATypeInTheAssembly).AssemblyQualifiedName;
return str.Split(',')[1].Trim();

答案 4 :(得分:0)

Assembly.GetName().Name将为您提供默认命名空间

答案 5 :(得分:0)

仅采用命名空间遵循以下代码:

  var assembly = System.Reflection.Assembly.GetAssembly(this.GetType());//Get the assembly object
  var nameSpace = assembly.GetType().Namespace;//Get the namespace

public string GetNamespace(object obj)
{
    var nameSpace = obj.GetType().Namespace;//Get the namespace

    return nameSpace;
}

答案 6 :(得分:0)

获取程序集必须包含几乎一个类(或任何其他类型,如接口),并且它们必须包含在命名空间中,该命名空间必须在程序集命名空间内启动,其中最短的将是最后一个

所以,这是我找到的解决方案:

Uncaught ReferenceError: EXIF is not defined

我只是在所需的程序集中找到所有类型,并且我搜索哪个包含在名称最短的名称空间中。