我有一个属性类型为List<SomeEnum>
的类。大概是这样的:
public enum MyEnum
{
A,
B
}
public class MyClass
{
public string Id { get; set; }
public List<MyEnum> Values { get; set; }
}
字符串
我已经在用EnumRepresentationConvention
了:
ConventionRegistry.Register("EnumStringConvention", new ConventionPack { new EnumRepresentationConvention(BsonType.String) }, t => true);
型
尽管如此,Values
属性还是被序列化为一个int数组(简单的枚举属性可以正确地作为int处理)。在列表序列化的上下文中似乎没有使用该约定。
我如何强制序列化程序写字符串而不是整型?
3条答案
按热度按时间b4lqfgs41#
不调用
ConventionRegistry.Register()
,而是将数据注解[BsonRepresentation(BsonType.String)]
添加到MyClass的属性Values
。字符串
修改后,
collection.InsertOne(obj);
保存了以下内容:型
pkln4tw62#
唉,这个公关已经关闭,因为不会修复。https://github.com/mongodb/mongo-csharp-driver/pull/305#issuecomment-731475503。
这是有充分理由的,但我认为这是人们想要做的事情,所以根据你的胃口,你可以试试这个(.NET 5):
字符串
现在,您可以在通常使用
TEnum
的任何地方使用EnumWrapper<TEnum>
,并且它将执行您想要的操作。如果你没有注册序列化提供程序,它将序列化为嵌套对象,所以在做任何事情之前,你应该调用这个:型
fxnxkyjh3#
这段代码解决了将枚举集合序列化为字符串数组的问题,看起来很简单,但花了一段时间才弄清楚:
呼叫
字符串
在任何其他代码BSON代码之前,其中EnumProvider是:
型
不要担心在这里使用反射的性能,这段代码对每个枚举类型调用一次