我想动态创建一个字典,其中键将是对象属性的名称,该值将是选择该属性的linq查询的结果。
MyObject[] records = getRecords();
foreach (property in MyObject.GetType().GetProperties())
{
data[property.Name] = records.Select(r => new { x = r.Date.ToString(), y = r.propertyInfo}).ToArray();
}
答案 0 :(得分:8)
您需要使用更多反射:
property.GetValue(r)
您还应该使用ToDictionary()
:
data = typeof(MyObject).GetProperties().ToDictionary(p => p.Name, p => ...)
答案 1 :(得分:0)
首先,MyObject
是一个类,而不是一个对象。 GetType()
是MyObject
的非静态函数,因此您只能在创建new Myobject()
之后调用我假设您要使用typeof(MyObject)
。
PropertyInfo
的所有公共可读属性创建MyObject
个对象的序列。MyObject
的属性值序列。 请注意,在以小步骤创建查询时,不会枚举任何内容,只会创建查询。只会枚举GetProperties
和ToDictionary
。
IEnumerable<MyObject> records = GetRecords();
IEnumerable<PropertyInfo> readableProperties= typeof(MyObject).GetProperties
.Where(property => property.CanRead);
var propertyValues = readableProperties // for every property
.Select(propertyInfo => new // create one new object of anonymous type
{
PropertyName = propertyInfo.Name, // with the name of the property
PropertyValues = records // and a sequence of all values of this property
.Select(record => propertyInfo.GetValue(record))
}
最后到字典:key是属性名,value是propertyValues的序列:
var result = propertyValues // put every item in the collection of propertyValues
.ToDictionary( // into a dictionary
item => item.PropertyName, // Key is the PropertyName of each item
item => item.PropertyValues); // Value is the sequence of PropertyValues of each item