调用DynamoDB SaveAsync存储运行时生成对象时报System.Object不支持错误
问题原因与解决方案
核心报错原因
你已经通过反射指定了泛型参数为运行时生成的类型,仍然触发该报错,核心是AWS DynamoDB SDK的DataModel组件无法识别你生成的运行时类型的有效成员,具体可分为两类常见情况:
- 你用
MyTypeBuilder生成的类型不符合SDK的解析要求:- 所有属性的类型被统一设置为
System.Object,SDK不支持无具体类型的object属性作为存储字段 - 生成的属性没有公开的
get/set访问器,SDK扫描不到有效成员,就会将类型判定为无成员的System.Object - 动态生成的程序集/类型访问权限为内部/私有,SDK的类型解析器无法读取类型成员信息
- 所有属性的类型被统一设置为
- 部分版本的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
相关产品推荐
相关产品推荐

