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

调用DynamoDB SaveAsync存储运行时生成对象时报System.Object不支持错误

问题原因与解决方案

核心报错原因

你已经通过反射指定了泛型参数为运行时生成的类型,仍然触发该报错,核心是AWS DynamoDB SDK的DataModel组件无法识别你生成的运行时类型的有效成员,具体可分为两类常见情况:

  1. 你用MyTypeBuilder生成的类型不符合SDK的解析要求:
    • 所有属性的类型被统一设置为System.Object,SDK不支持无具体类型的object属性作为存储字段
    • 生成的属性没有公开的get/set访问器,SDK扫描不到有效成员,就会将类型判定为无成员的System.Object
    • 动态生成的程序集/类型访问权限为内部/私有,SDK的类型解析器无法读取类型成员信息
  2. 部分版本的AWS SDK内部解析时,会优先取存储对象的运行时类型而非泛型参数类型,如果你生成的类型本身有问题,就会出现类型识别错误。

修复方案

按优先级执行以下步骤排查修复:

1. 修正运行时类型生成逻辑

修改MyTypeBuilder的实现,确保满足以下要求:

  • 每个属性的类型和字段实际值的类型匹配,不要统一设置为object,比如示例中字段值为字符串,属性类型就设为typeof(string)
  • 所有属性都生成公开的可读写访问器,不要设置私有/内部访问权限
  • 动态生成的程序集需要标记为对AWSSDK程序集可见,或者将生成的类型设为公共类型。

2. 补充DynamoDB特性标记(可选,兼容效果更好)

生成类型时,给类型添加[DynamoDBTable]特性指定目标表名,给每个属性添加[DynamoDBProperty]特性标记存储字段,避免SDK默认解析规则的兼容问题。

3. 备选方案:绕开动态类型生成

如果不需要强制用动态类型实现,可直接用DynamoDB的Document类操作,不需要生成运行时类型,实现逻辑更简单:

var doc = new Document();
foreach (var field in fieldAndValueList)
{
    doc[field.Name] = field.Value;
}
await dynamoDbContext.SaveAsync(doc, MyDynamoTableConfig);

验证方法

你可以在反射调用SaveAsync之前增加调试代码,确认生成的类型符合要求:

var properties = myNewType.GetProperties();
Console.WriteLine($"生成类型{myNewType.Name}的公开属性数量:{properties.Length}");
foreach (var prop in properties)
{
    Console.WriteLine($"属性名:{prop.Name},类型:{prop.PropertyType.FullName},可读写:{prop.CanRead && prop.CanWrite}");
}

如果输出的属性数量为0,或者属性类型均为System.Object,即可确认是类型生成逻辑的问题。

内容的提问来源于stack exchange,提问作者JaimeCamargo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 04:24:02