gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:27:40 27 4
gpt4 key购买 nike

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

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com