Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取.NET类层次结构_C#_.net_Structure_Hierarchy - Fatal编程技术网

C# 获取.NET类层次结构

C# 获取.NET类层次结构,c#,.net,structure,hierarchy,C#,.net,Structure,Hierarchy,我试图获取.NET Framework中的所有对象及其名称空间的层次结构顺序,并将它们放入树结构或某种类型的C语言中用于学术目的。我试图为特定的.NET Framework平台执行此操作。有没有办法做到这一点 请求:列出System.Threading命名空间下的所有类、枚举、结构等 结果: 建造商: 废弃互斥 障碍 连锁的 废话 结构: 异步流量控制 取消令牌 废话 代表们: ContexCallback 委托 废话 枚举: 废话 非常感谢 编辑:我不是要求代码示例或有人为我编写代码-我只是不

我试图获取.NET Framework中的所有对象及其名称空间的层次结构顺序,并将它们放入树结构或某种类型的C语言中用于学术目的。我试图为特定的.NET Framework平台执行此操作。有没有办法做到这一点

请求:列出System.Threading命名空间下的所有类、枚举、结构等

结果:

建造商:

废弃互斥 障碍 连锁的 废话 结构:

异步流量控制 取消令牌 废话 代表们:

ContexCallback 委托 废话 枚举:

废话 非常感谢


编辑:我不是要求代码示例或有人为我编写代码-我只是不知道从哪里开始,所以我正在寻找一些技巧。

以下是一些关于如何开始的指南:

您将需要使用,即System.Reflection命名空间程序集、ConstructorInfo、PropertyInfo和类似程序中的类。如MSDN所述:

System.Reflection命名空间中的类以及System.Type使您能够获取有关加载的程序集以及其中定义的类型的信息,例如类、接口和值类型。您还可以使用反射在运行时创建类型实例,并调用和访问它们

首先获取Assembly类的实例。您可以从要访问任何类型的程序集中传递类型,例如System.Threading.Barrier,并使用assembly.GetAssembly:

或者,如果要遍历.dll文件文件夹,可以使用Assembly.LoadFrom:

拥有程序集实例后,您将希望遍历这些类型并对它们进行进一步的反射:

foreach (var type in assembly.GetTypes())
{
    var constructors = type.GetConstructors();
    var fields = type.GetFields();
    var properties = type.GetProperties();
    ...
}
除了这些方法之外,Type类还包含各种属性,这些属性允许您查看指定的类型是类还是结构类型。IsValueType、Type.IsInterface、Type.IsaStract等,查看一个类型是否继承或实现不同的一个类型。IsAssignableFromotherType、Type.GetInterfaces等


如果您可以为您感兴趣的框架进行转换,您可能会发现转换该框架比直接从代码中提取此信息更容易。

有人Groo已经给出了关于如何操作的理论回答,但请注意,至少有两个强烈的警告:

任何Microsoft程序集都可以包含System.Threading类,从技术上讲,任何程序集都可以包含它,即使是您的程序集,但这样做是不礼貌的 如果您想探索基本程序集mscorlib、系统。。。从与您运行的.NET版本不同的.NET中,您将需要Mono.Cecil或类似的库,因为使用反射,您无法加载与您运行的基本程序集版本不同的基本程序集 下面是一些非常简单的代码:

var assemblyNames = new[]
{
    "mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",
    "System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",
    "System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",
};

var nss = new[]
{
    "System.Threading"
};


// Begin real code

var assemblies = Array.ConvertAll(assemblyNames, Assembly.Load);
var nss2 = Array.ConvertAll(nss, x => x + ".");

var types = assemblies.SelectMany(x => x.ExportedTypes).Where(x => nss2.Any(y => x.FullName.StartsWith(y))).ToArray();

// The Delegate check is taken from http://mikehadlow.blogspot.it/2010/03/how-to-tell-if-type-is-delegate.html
var classes = types.Where(x => x.IsClass && !typeof(Delegate).IsAssignableFrom(x)).ToArray();
var structs = types.Where(x => x.IsValueType && !x.IsEnum).ToArray();
var enums = types.Where(x => x.IsEnum).ToArray();
var delegates = types.Where(x => x.IsClass && typeof(Delegate).IsAssignableFrom(x)).ToArray();

// There is a DeclaringType property to see what Type is declaring them
var constructors = types.SelectMany(x => x.GetConstructors(BindingFlags.Public | BindingFlags.Instance)).ToArray();

这不是一个为我做事的网站。。。开始写一些代码。您需要从一组程序集mscorlib开始,至少从系统开始,然后探索它们。@xanatos我知道,我只是不知道从哪里开始。请注意,如果您想在不同于您运行应用程序的框架中执行此操作,则更难。。。您需要使用Mono.Cecil或类似的库来加载另一个.NET Framework。您可以检查.NET 3.5类海报。但是如果你想自己创建一个,你需要迭代所有的类。为什么要这样做?我不知道给定的名称空间,但是*任何DLL都可能在任何名称空间中定义对象。因此,为了完全覆盖,可能需要通过GAC进行迭代,这取决于OP的规格。@devio这本身就是一个问题:-
foreach (var type in assembly.GetTypes())
{
    var constructors = type.GetConstructors();
    var fields = type.GetFields();
    var properties = type.GetProperties();
    ...
}
var assemblyNames = new[]
{
    "mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",
    "System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",
    "System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",
};

var nss = new[]
{
    "System.Threading"
};


// Begin real code

var assemblies = Array.ConvertAll(assemblyNames, Assembly.Load);
var nss2 = Array.ConvertAll(nss, x => x + ".");

var types = assemblies.SelectMany(x => x.ExportedTypes).Where(x => nss2.Any(y => x.FullName.StartsWith(y))).ToArray();

// The Delegate check is taken from http://mikehadlow.blogspot.it/2010/03/how-to-tell-if-type-is-delegate.html
var classes = types.Where(x => x.IsClass && !typeof(Delegate).IsAssignableFrom(x)).ToArray();
var structs = types.Where(x => x.IsValueType && !x.IsEnum).ToArray();
var enums = types.Where(x => x.IsEnum).ToArray();
var delegates = types.Where(x => x.IsClass && typeof(Delegate).IsAssignableFrom(x)).ToArray();

// There is a DeclaringType property to see what Type is declaring them
var constructors = types.SelectMany(x => x.GetConstructors(BindingFlags.Public | BindingFlags.Instance)).ToArray();