访问嵌套对象字段
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 访问数据的最佳实践,因此将您的字段更改为属性可能是值得的。如果您真的想将它们保留为字段,您可能需要稍微调整一下,但递归展开泛型类型的想法保持不变。
我想访问嵌套在结构中的对象的字段名称,如下所示:
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 访问数据的最佳实践,因此将您的字段更改为属性可能是值得的。如果您真的想将它们保留为字段,您可能需要稍微调整一下,但递归展开泛型类型的想法保持不变。