访问嵌套对象字段

Access nested Object fields

我想访问嵌套在结构中的对象的字段名称,如下所示:

public class Playerframe
{
  public string Attr1;
  public string Attr2;
}

public class MatchMoment
{
  public int MomentNr;
  public Dictionary <int, Playerframe> PlayerData;
}

public DataTable CreateTable (List<dynamic>Moments)
{
 DataTable table = new DataTable();
 List<string> = Moments[0]...... 

 /// get all class Properties, including the Playerframe properties in order 
 /// to create correctly named DataTable columns
 /// The List<string> should finally contain {"MomentNr","Attr1","Attr2"}

 return table;
}

我现在的问题是如何使用 System.Reflection 访问存储在 MatchMoment 对象对象中 Dictionary 值中的字段名称 ("e.g. Attr1")?

我想编写一个函数,它根据方法参数中定义的任何给定对象的属性创建一个数据表对象,如上所示。

谢谢你的帮助!

最大

我认为以下代码片段可能会满足您的需求。基本上,它遍历列表的元素类型的属性以获取它们的名称,并且在泛型 属性 类型的情况下,递归地获取泛型类型参数的属性的名称。

public DataTable CreateTable(List<dynamic> Moments)
{
    var table = new DataTable();

    var elementType = GetElementType(Moments);
    var propertyNames = GetPropertyNames(elementType);

    // Do something with the property names . . .

    return table;
}

private static Type GetElementType(IEnumerable<dynamic> list) =>
    list.GetType().GetGenericArguments()[0];

private static IEnumerable<string> GetPropertyNames(Type t)
{
    return t.GetProperties().SelectMany(getPropertyNamesRecursively);

    IEnumerable<string> getPropertyNamesRecursively(PropertyInfo p) =>
        p.PropertyType.IsGenericType
            ? p.PropertyType.GetGenericArguments().SelectMany(GetPropertyNames)
            : new[] { p.Name };
}

请注意,这只查看属性,而您当前的 类 只使用字段。但是,属性的​​使用被认为是 public 访问数据的最佳实践,因此将您的字段更改为属性可能是值得的。如果您真的想将它们保留为字段,您可能需要稍微调整一下,但递归展开泛型类型的想法保持不变。