从另一个具有 dictionary<string, object> 属性 且具有不同键值对的对象构造一个动态对象
Construct a dynamic object from another object that has dictionary<string, object> property with varying key-value pairs
我正在尝试整理包含一些静态属性的现有对象的属性。该对象还包含一个带有键值对的字典。这些键值对应该作为属性动态添加到我正在创建的新对象中。
这是源对象的设置:
public class MyClass
{
public string PropA { get; set; }
public string PropB { get; set; }
public string PropC { get; set; }
public IDictionary<string, NameValuePair> PropD { get; set; }
}
public class NameValuePair
{
public string Name { get; set; }
public string Value { get; set; }
}
这是我创建对象列表的地方:
void Main()
{
var data = new List<MyClass>
{
new MyClass {PropA = "A1", PropB = "B1", PropC = "C1", PropD = new Dictionary<string, NameValuePair>
{
{ "Code11", new NameValuePair {Name = "PropD11", Value = "V11"}},
{ "Code12", new NameValuePair {Name = "PropD12", Value = "V12"}}
}},
new MyClass {PropA = "A2", PropB = "B2", PropC = "C2", PropD = new Dictionary<string, NameValuePair>
{
{ "Code21", new NameValuePair {Name = "PropD21", Value = "V21"}},
{ "Code22", new NameValuePair {Name = "PropD22", Value = "V22"}},
}},
new MyClass {PropA = "A3", PropB = "B3", PropC = "C3", PropD = new Dictionary<string, NameValuePair>
{
{ "Code12", new NameValuePair {Name = "PropD12", Value = "V31"}},
{ "Code21", new NameValuePair {Name = "PropD21", Value = "V32"}},
}},
};
//Extract column names from static properties
var staticColumns = typeof(MyClass).GetProperties().Where(n => n.PropertyType == typeof(string)).Select(p => p.Name);
//Extract column names from the dictionary
var dynamicColumns = data.Where(c => c.PropD.Any()).Select(c => c.PropD).SelectMany(c => c.Values.Select(v => v.Name)).Distinct().ToList();
//Combine to get a new list of columns
var columns = staticColumns.Union(dynamicColumns);
//Create object using columns
//Copy values from data to construct the new object.
}
我需要逻辑方面的帮助来在运行时构造一个对象,该对象具有如下结构和正确映射的数据。
PropA PropB PropC PropD11 PropD12 PropD21 PropD22
------------------------------------------------------------
A1 B1 C1 V11 V12
A2 B2 C2 V21 V22
A3 B3 C3 V31 V32
假设您可能的 属性 名称是静态的,这里是答案 class:
public class AnsClass {
public string PropA { get; set; }
public string PropB { get; set; }
public string PropC { get; set; }
public string PropD11 { get; set; }
public string PropD12 { get; set; }
public string PropD21 { get; set; }
public string PropD22 { get; set; }
}
这里是创建它们列表的 LINQ 语句:
var ans = data.Select(d => new AnsClass {
PropA = d.PropA,
PropB = d.PropB,
PropC = d.PropC,
PropD11 = d.PropD.Values.FirstOrDefault(v => v.Name == "PropD11")?.Value,
PropD12 = d.PropD.Values.FirstOrDefault(v => v.Name == "PropD12")?.Value,
PropD21 = d.PropD.Values.FirstOrDefault(v => v.Name == "PropD21")?.Value,
PropD22 = d.PropD.Values.FirstOrDefault(v => v.Name == "PropD22")?.Value,
})
.ToList();
如果 PropD
的成员是动态的,您可以使用以下内容创建 ExpandoObjects
但您最好直接使用 MyClass
的方式 - 它有这已经是最好的设计了。
var ans2 = new List<dynamic>();
foreach (var d in data) {
dynamic eo = new ExpandoObject();
eo.PropA = d.PropA;
eo.PropB = d.PropB;
eo.PropC = d.PropC;
var deo = (IDictionary<string,object>)eo;
foreach (var dp in d.PropD.Values)
deo.Add(dp.Name, dp.Value);
ans2.Add(eo);
}
我正在尝试整理包含一些静态属性的现有对象的属性。该对象还包含一个带有键值对的字典。这些键值对应该作为属性动态添加到我正在创建的新对象中。
这是源对象的设置:
public class MyClass
{
public string PropA { get; set; }
public string PropB { get; set; }
public string PropC { get; set; }
public IDictionary<string, NameValuePair> PropD { get; set; }
}
public class NameValuePair
{
public string Name { get; set; }
public string Value { get; set; }
}
这是我创建对象列表的地方:
void Main()
{
var data = new List<MyClass>
{
new MyClass {PropA = "A1", PropB = "B1", PropC = "C1", PropD = new Dictionary<string, NameValuePair>
{
{ "Code11", new NameValuePair {Name = "PropD11", Value = "V11"}},
{ "Code12", new NameValuePair {Name = "PropD12", Value = "V12"}}
}},
new MyClass {PropA = "A2", PropB = "B2", PropC = "C2", PropD = new Dictionary<string, NameValuePair>
{
{ "Code21", new NameValuePair {Name = "PropD21", Value = "V21"}},
{ "Code22", new NameValuePair {Name = "PropD22", Value = "V22"}},
}},
new MyClass {PropA = "A3", PropB = "B3", PropC = "C3", PropD = new Dictionary<string, NameValuePair>
{
{ "Code12", new NameValuePair {Name = "PropD12", Value = "V31"}},
{ "Code21", new NameValuePair {Name = "PropD21", Value = "V32"}},
}},
};
//Extract column names from static properties
var staticColumns = typeof(MyClass).GetProperties().Where(n => n.PropertyType == typeof(string)).Select(p => p.Name);
//Extract column names from the dictionary
var dynamicColumns = data.Where(c => c.PropD.Any()).Select(c => c.PropD).SelectMany(c => c.Values.Select(v => v.Name)).Distinct().ToList();
//Combine to get a new list of columns
var columns = staticColumns.Union(dynamicColumns);
//Create object using columns
//Copy values from data to construct the new object.
}
我需要逻辑方面的帮助来在运行时构造一个对象,该对象具有如下结构和正确映射的数据。
PropA PropB PropC PropD11 PropD12 PropD21 PropD22
------------------------------------------------------------
A1 B1 C1 V11 V12
A2 B2 C2 V21 V22
A3 B3 C3 V31 V32
假设您可能的 属性 名称是静态的,这里是答案 class:
public class AnsClass {
public string PropA { get; set; }
public string PropB { get; set; }
public string PropC { get; set; }
public string PropD11 { get; set; }
public string PropD12 { get; set; }
public string PropD21 { get; set; }
public string PropD22 { get; set; }
}
这里是创建它们列表的 LINQ 语句:
var ans = data.Select(d => new AnsClass {
PropA = d.PropA,
PropB = d.PropB,
PropC = d.PropC,
PropD11 = d.PropD.Values.FirstOrDefault(v => v.Name == "PropD11")?.Value,
PropD12 = d.PropD.Values.FirstOrDefault(v => v.Name == "PropD12")?.Value,
PropD21 = d.PropD.Values.FirstOrDefault(v => v.Name == "PropD21")?.Value,
PropD22 = d.PropD.Values.FirstOrDefault(v => v.Name == "PropD22")?.Value,
})
.ToList();
如果 PropD
的成员是动态的,您可以使用以下内容创建 ExpandoObjects
但您最好直接使用 MyClass
的方式 - 它有这已经是最好的设计了。
var ans2 = new List<dynamic>();
foreach (var d in data) {
dynamic eo = new ExpandoObject();
eo.PropA = d.PropA;
eo.PropB = d.PropB;
eo.PropC = d.PropC;
var deo = (IDictionary<string,object>)eo;
foreach (var dp in d.PropD.Values)
deo.Add(dp.Name, dp.Value);
ans2.Add(eo);
}