gpt4 book ai didi

c# - 使用 ProtoBuf.Meta 接口(interface)模仿 ProtoEnumAttribute

转载 作者:太空宇宙 更新时间:2023-11-03 11:11:42 25 4
gpt4 key购买 nike

protobuf-net ,您可以使用 ProtoEnumAttribute 覆盖枚举的有线格式,如下所示:

[ProtoContract]
enum MyEnum
{
[ProtoEnum(Value=1)]
Default,
[ProtoEnum(Value=10)]
Foo
}

有了这些属性,Default 通常会序列化为 0Foo 会序列化为 1,它们现在会序列化分别为 110

我想做的是使用 ProtoBuf.Meta 中的接口(interface)模仿这种行为,所以我不必注释枚举(因为我通常不会在我的项目中控制它们)。

通过 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++;
}

但是,我无法将其依赖于反射(reflect)到私有(private)(只读!)字段中,这只是自找麻烦。

那么,在 protobuf-net 中是否有一种支持在运行时覆盖枚举线值的方法?

最佳答案

我不是在 PC 上检查这个,所以如果我在胡说八道,你必须纠正我,但它应该是这样的(在应用程序的早期):

RuntimeTypeModel.Default.Add(typeof(MyEnum), false)
.Add(1, "Default").Add(10, "Foo");

第一行告诉它向模型添加一个新的Type没有 (false) 应用任何常用规则;第二行将 2 个成员添加到该类型的表示中,并具有所需的值。

如果这不起作用(我会在今天晚些时候尝试检查),请告诉我,我会使它起作用(或提供等效的 API)。可能只是因为在没有属性的情况下工作时,这种情况根本没有出现让我验证它。

关于c# - 使用 ProtoBuf.Meta 接口(interface)模仿 ProtoEnumAttribute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13783894/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com