C#:列出程序集中的所有类


103

我想输出(以编程方式-C#)我程序集中所有类的列表。

任何提示或示例代码如何执行此操作?反射?


如果您打算检查项目未引用的程序集,请参阅我的最新答案。
Thorarin

Answers:


152

使用Assembly.GetTypes。例如:

Assembly mscorlib = typeof(string).Assembly;
foreach (Type type in mscorlib.GetTypes())
{
    Console.WriteLine(type.FullName);
}

1
对大型装配有什么建议吗?当我为13.8 MB的程序集运行此代码时,我的VS实例将无限期地挂起。我尝试了一个9 KB的小程序集,并且工作正常。我知道您在想什么-为什么要有13.8 MB的程序集-它是使用NetTeirs模板生成的数据层的一部分。我们有很多桌子。
dyslexicanaboko 2014年

1
@dyslexicanaboko:好吧,如果您有很多类型,枚举它们将花费很长时间。有多少类型在汇编关系吗?那你在跟他们做什么?(您确定问题出在提取类型,还是只是事后要做的事情?)
Jon Skeet 2014年

我无法通过asm.GetTypes()调用,它只是挂起了-我的意思是很明显的事实是,有很多类型-我什么也做不了,因为它正在努力尝试全部获取它们。我的4个核心之一将CPU的命中率提高到30%。我的意思是说,我真的想知道是否有办法说“嘿-仅在此名称空间中查找”-我觉得这是不可能的,因为GetTypes()方法只有一个空的构造函数。我正在尝试制作各种对象浏览器。
dyslexicanaboko 2014年

1
好点,我还没有尝试过。我现在的工作是直接使用asm.GetType(fullyQualifiedClassName)定位类,这种方法可以工作,但是无法向用户显示类列表,这正是我想要的。这不是面向btw的客户,我正在内部为自己和其他开发人员使用它。
dyslexicanaboko 2014年

1
@DebugErr:是的-这是很容易让它只是如果你想要类,但我的猜测是,OP可能真的希望所有的类型。
乔恩·斯基特

102

我只想补充一下乔恩的例子。要获得对您自己的程序集的引用,可以使用:

Assembly myAssembly = Assembly.GetExecutingAssembly();

System.Reflection 命名空间。

如果要检查没有参考的部件,则可以使用以下两种方法之一:

Assembly assembly = Assembly.ReflectionOnlyLoad(fullAssemblyName);
Assembly assembly = Assembly.ReflectionOnlyLoadFrom(fileName);

如果打算在实例化类型后实例化它:

Assembly assembly = Assembly.Load(fullAssemblyName);
Assembly assembly = Assembly.LoadFrom(fileName);

有关更多信息,请参见Assembly类文档

一旦有了对Assembly对象的引用,就可以assembly.GetTypes()像已经演示过的Jon一样使用。


如何引用解决方案中的完全不同的程序集?
亚历克斯

13
最简单的方法是先使用typeof该程序集中的已知类型,然后再使用该Assembly属性,如我的示例所示。
乔恩·斯基特

2
如果要引用解决方案中的程序集(例如abc.dll),并且可以对dll名称进行硬编码,则引用该程序集的另一种方法是:Assembly Assembly = Assembly.Load(“ abc”);`
卡什(Kash)2012年

它仅加载当前程序集。我有一个使用4个dll或项目的应用程序或exe。如何获得这些dll的类的名称?
Er Mayank 2014年

@JonSkeet在“现代” C#环境中如何实现?例如在进行UWP开发时。UWP没有GetExecutingAssembly()方法。
丹尼尔·阿姆斯特朗
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.