You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 20:09:23