C#中动态构建自定义属性对象:非IDictionary实现方案咨询
在C#中创建带动态属性的单个对象解决方案
需求说明
将数据库返回的包含name和age字段的对象数组,转换为以name为属性名、age为属性值的单个动态对象,用于templater插件生成Word文档。
解决方案:使用ExpandoObject
ExpandoObject是C#中实现动态属性的最佳选择,它既支持通过字典接口动态添加属性,又能像普通对象一样直接访问属性,完全适配templater插件对单个对象格式的要求。
步骤1:定义数据源映射类(可选,若数据库返回强类型数据)
如果数据库返回的是强类型集合,先定义对应实体类:
public class Person { public string Name { get; set; } public int Age { get; set; } }
步骤2:转换为动态对象
// 模拟从数据库获取的强类型集合 var persons = new List<Person> { new Person { Name = "John", Age = 35 }, new Person { Name = "Greesham", Age = 37 }, new Person { Name = "Raman", Age = 42 }, new Person { Name = "Krish", Age = 30 } }; // 创建动态对象并填充属性 dynamic resultObj = new ExpandoObject(); var dict = (IDictionary<string, object>)resultObj; foreach (var person in persons) { dict[person.Name] = person.Age; } // 使用示例:直接访问动态属性 // int johnAge = resultObj.John; // 输出35
针对JSON数据源的转换(若数据库返回JSON格式)
如果数据库返回的是JSON数组,可结合Newtonsoft.Json处理:
using Newtonsoft.Json.Linq; // 模拟数据库返回的JSON数组 JArray rawData = JArray.Parse(@"[ {""name"":""John"", ""age"":35}, {""name"":""Greesham"", ""age"":37}, {""name"":""Raman"",""age"":42}, {""name"":""Krish"", ""age"":30} ]"); dynamic resultObj = new ExpandoObject(); var dict = (IDictionary<string, object>)resultObj; foreach (JToken item in rawData) { string name = item["name"].ToString(); int age = item["age"].Value<int>(); dict[name] = age; }
说明
ExpandoObject实现了IDictionary<string, object>,所以可以通过字典方式动态添加属性,同时支持动态对象的属性访问语法。- 该对象可以直接传递给templater插件,插件会识别其动态属性并完成Word文档渲染。
内容的提问来源于stack exchange,提问作者Shabbir G
相关产品推荐
相关产品推荐

