我如何获得.NET中的类列表

时间:2011-04-29 03:36:14

标签: c# reflection

我尝试了Assembly.ReflectionOnlyLoadFrom(@"path\System.Core.dll")和ReflectionOnlyLoad,但我遇到了异常和错误。如何正确获取程序集中的所有名称空间/类?

例如我得到了这个例外。

Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.

3 个答案:

答案 0 :(得分:3)

加载程序集,然后获取所有类型的列表:

Assembly assembly = Assembly.ReflectionOnlyLoadFrom("System.Core.dll");
Type[] types = assembly.GetTypes();

不幸的是,如果无法加载任何暴露类型,这将引发异常,有时无法避免此加载失败。在这种情况下,抛出的异常包含已成功加载的所有类型的列表,因此我们可以这样做:

Assembly assembly = Assembly.ReflectionOnlyLoadFrom("System.Core.dll");

Type[] types;
try
{
    types = assembly.GetTypes();
}
catch (ReflectionTypeLoadException ex)
{
    types = ex.Types;
}

这将为您提供所有类型的列表,包括接口,结构,枚举等...(如果您只想要类,那么您可以过滤该列表。)

答案 1 :(得分:2)

如果您可以参考System.Core,那么

    List<string> namespaces = new List<string>();

    var refs = Assembly.GetExecutingAssembly().GetReferencedAssemblies();

    foreach (var rf in refs) {
        if (rf.Name == "System.Core")
        {
            var ass = Assembly.Load(rf);
            foreach (var tp in ass.GetTypes())
            {
                if (!namespaces.Contains(tp.Namespace))
                {
                    namespaces.Add(tp.Namespace);
                    Console.WriteLine(tp.Namespace);
                }
            }
        }
    }

如果不能,则需要附加到CurrentDomain的AssemblyResolve事件并加载System.Core.dll在加载dll时使用的所有类型的程序集。

答案 2 :(得分:1)

以下是您提问的answer。 我不需要复制&amp;将它粘贴到此处,可能更绿色以节省空间,而不是从其他线程复制代码。 : - )