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

Syn*_*ter 32 .net c# 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");   
Run Code Online (Sandbox Code Playgroud)

我需要得到大会的类型.为了得到类型我需要程序集的命名空间.

Type t = asm.GetType("NAMESPACE.CLASSNAME",false,true);             
Run Code Online (Sandbox Code Playgroud)

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

Type.Namespace;
Run Code Online (Sandbox Code Playgroud)

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

提前致谢

sha*_*oth 34

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

然后我猜你可以简单地检查所有类型都有相同的Namespace值并使用这个值.否则添加一些其他逻辑来检测要考虑主要的命名空间.


egl*_*ius 22

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

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

myassembly.GetTypes().SingleOrDefault(t => t.Name == "ClassName")
Run Code Online (Sandbox Code Playgroud)

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

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

Assembly.Load("ClassName").GetTypes().Select(t => t.Namespace).Distinct();
Run Code Online (Sandbox Code Playgroud)


RAM*_*RAM 16

更新:

IFassembly name&assembly namespace相同的项目,并确定保留的主题相同你想要得到的命名空间执行大会电流 ,然后你可以使用这个:

var namespace = Assembly.GetExecutingAssembly().GetName().Name;
Run Code Online (Sandbox Code Playgroud)

对于你加载的程序集:

var namespace = myAssembly.GetName().Name;
Run Code Online (Sandbox Code Playgroud)

如果您的项目中的assembly name&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();
Run Code Online (Sandbox Code Playgroud)

  • @ErikE,谢谢你的暗示.我知道问题已得到解答,我的回答是这种情况的第二种方式:默认情况下它们是相同的,在某些情况下开发人员保持相同,所以在这种情况下我的答案是正确的.我用额外的IF更新了我的答案. (2认同)