c# - 获取 AppDomain.CurrentDomain 中所有用户创建的类

标签 c# reflection .net-assembly

我想遍历我在项目中添加的所有类

Assembly[] foo = AppDomain.CurrentDomain.GetAssemblies();

foreach(Assembly a in foo)
{                
    foreach(Type t in a.GetTypes())
    {

    }
}

这是我尝试过的,但我想排除 .net 提供的程序集,例如“mscorlib”

最佳答案

一个常见的解决方案是按名称过滤程序集,如果您的所有程序集都有一个共同的前缀(如果您有或多或少的唯一前缀)。

var foo = AppDomain.CurrentDomain.GetAssemblies()
                                 .Where(a=>a.FullName.StartsWith("MyProject."));

如果您只对某些特定类型感兴趣,请考虑使用 attributes为您的类(class),甚至在汇编级别添加一个。

示例:

创建一个属性:

[AttributeUsage(AttributeTargets.Assembly)]
public class MyAssemblyAttribute : Attribute { }

将以下内容添加到您的 AssemblyInfo.cs:

[assembly: MyAssemblyAttribute()]

并过滤您正在查看的程序集:

var foo = AppDomain.CurrentDomain
                   .GetAssemblies()
                   .Where(a => a.GetCustomAttributes(typeof(MyAssemblyAttribute), false).Any());

你还会发现at this question有趣的。在 one answer建议检查每个程序集的完全限定名称,但这非常繁琐,例如:

//add more .Net BCL names as necessary
var systemNames = new HashSet<string>
{
    "mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",
    "System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
    ...
};

var isSystemType = systemNames.Contains(objToTest.GetType().Assembly.FullName); 

标记您的程序集(按名称或属性)总是比尝试识别哪些程序集是 .Net 框架的一部分更容易。

关于c# - 获取 AppDomain.CurrentDomain 中所有用户创建的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10881601/

相关文章:

.net - project.json 相当于 InternalsVisibleTo

C# WinForms 程序,能够为其制作 C++ 插件

c# - 带有字符串数组的 DataTemplate

c# - 如果用户通过声明进行身份验证,如何 checkin 共享点?

scala - Scala中枚举子类的字段

.net - 引用的 DLL 未复制到引用项目

c# - 将连接字符串与后端代码分离

方法参数是接口(interface)的Java反射

c# - 无法为当前正在执行的程序集中未定义的类型获取 Type 类的实例

c# - 如何在 C# 中创建可供 MATLAB 使用的 .net 程序集?