使用节点填充 C# 类型和属性的邻接列表

问题描述

我的问题与 this one 类似,但我有类似 200 个类,这些类都是使用 { 从 XML 模式自动生成[1] {3}},最佳答案建议使用自定义属性标记每个类。这将花费很长时间,所以我想通过深度优先搜索更具启发性地进行。

所有生成的类型(有类和枚举)都在五个命名空间内,所以我可以简单地使用 SomeType.Namespace == "mynamespace" 进行检查。没有循环依赖或组合——所有的类都包含在上面提到的五个命名空间中定义的类型的实例变量,最简单的类最终归结为包含一个数字/布尔原语,一个stringenumSystem.Collections.ObjectModel.Collection<>

我目前有以下代码

private static readonly Assembly MyAssembly = Assembly.Load("MyLib");
private static readonly IEnumerable<Type> MyTypes = MyAssembly.GetTypes();
private static readonly IEnumerable<Type> MyClasses = MyTypes.Where(type => type.IsClass);
private static Dictionary<Type,PropertyInfo[]> MyTypePropertiesAndNames = MyClasses.ToDictionary(type => type,type => type.GetProperties());

public static void Main()
{
    GenerateAdjList();
}

public static LinkedList<string> GenerateAdjList()
{
    // what do I fill in here to return a fully-populated LinkedList?
}

我注意到 MyTypePropertiesAndNames 已经是某种尚未完全填充的“邻接列表”,所以我想知道如何使用该 Dictionary 创建一个完整的邻接列表。

链接问题中提到的一些问题是如何处理 List<>s(在我的例子中是 Collection<>s)和原始类型;我打算在点分隔的字符串中添加一对方括号,以向用户表示他们必须指定一个索引。


一个附录:给定一个在 5 个命名空间之一中定义类型的特定对象,我理想地希望将对象的整个结构生成Lookup<> 的各种类型,以便当用户指定对象的子属性名称,返回该子属性的所有可能路径。

假设我有以下类定义

public class Message 
{
    public Flight Flight {get; set;}
    // ... other properties
}

public class Flight 
{
    public Arrival Arrival {get; set;}
    public Departure Departure {get; set;}
    // ... other properties
}

public class Arrival 
{
    public Aerodrome Aerodrome {get; set;}
    // ... other properties
}

public class Departure
{
    public Aerodrome Aerodrome {get; set;}
    // ... other properties
}
...

如果用户执行类似 GetPropertyChains(message,"Aerodrome") 的操作,那么 "message.Flight.Arrival.Aerodrome""message.Flight.Departure.Aerodrome" 都应该返回。

我该如何解决这些问题?


[1]这些模式是 ICAO XmlSchemaClassGenerator 规范的一部分。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)