在protobuf-net中,您可以使用以下方式覆盖枚举的有线格式ProtoEnumAttribute
:
[ProtoContract]
enum MyEnum
{
[ProtoEnum(Value=1)]
Default,
[ProtoEnum(Value=10)]
Foo
}
使用这些属性,Default
通常将序列化到0
和Foo
到的位置1
现在将分别序列化到1
和10
。
我想做的是使用 中的接口来模仿这种行为ProtoBuf.Meta
,所以我不必注释枚举(因为我通常不会在我的项目中控制它们)。
挖掘 protobuf-net 的源代码,我设法使以下(简化了一点)工作:
var model = RuntimeTypeModel.Create();
var meta = model.Add(enumType, applyDefaultBehaviour: true);
var fields = meta.GetFields();
// Oh god why
var fieldNumber =
typeof(ValueMember).GetField(
"fieldNumber",
System.Reflection.BindingFlags.Instance |
System.Reflection.BindingFlags.NonPublic
);
List<string> ordered = GetDesiredEnumOrder(enumType);
int equiv = 0;
foreach (var val in ordered)
{
var field = fields.Single(f => f.Name == val);
fieldNumber.SetValue(field, equiv);
equiv++;
}
但是我不能依靠反射到一个私有(只读!)字段来发送这个,这只是自找麻烦。
那么,是否有一种受支持的方法可以在运行时覆盖 protobuf-net 中的枚举线值?