使用ProtoBuf.Meta接口模仿ProtoEnumAttribute在protobuf-net中,可以使用ProtoEnumAttribute来覆盖枚举的wireformat,如ProtoEnumAttribute:[ProtoContract]enumMyEnum{[ProtoEnum(Value=1)]Default,[ProtoEnum(Value=10)]Foo}使用这些属性,Default通常序列化为0,Foo序列化为1,现在分别序列化为1和10。我想要做的是使用ProtoBuf.Meta接口模仿这种行为,所以我不必注释枚举(因为我通常不在我的项目中控制它们)。通过挖掘protobuf-net的源代码,我设法使以下内容(稍微简化)起作用:varmodel=RuntimeTypeModel.Create();varmeta=model.Add(enumType,applyDefaultBehaviour:true);varfields=meta.GetFields();//天哪为什么varfieldNumber=typeof(ValueMember).GetField("fieldNumber",System.Reflection.BindingFlags.Instance|System.Reflection.BindingFlags.NonPublic);列表有序=GetDesiredEnumOrder(enumType);int当量=0;foreach(varvalinordered){varfield=fields.Single(f=>f.Name==val);fieldNumber.SetValue(field,equiv);等价++;但是,我不能依赖于反映到私有(只读!)字段,这只是自找麻烦。那么,在protobuf-net中是否有一种支持在运行时覆盖枚举行值的方法?我不是在PC上检查这个,所以如果我说的很疯狂,你必须纠正我,但它应该是这样的(在应用程序的早期):RuntimeTypeModel.Default.Add(typeof(MyEnum),false).Add(1,"默认").Add(10,"Foo");第一行告诉它向模型添加一个新类型,而不(false)应用任何通常的规则;第二行向的表示中的该类型添加2个成员,并具有所需的值。如果这不起作用(我会在今天晚些时候尝试检查),请告诉我,我会让它起作用(或提供等效的API)。可能只是在没有属性的情况下,案例根本不让我验证它。以上就是C#学习教程:使用ProtoBuf.Meta接口模仿ProtoEnumAttribute分享的所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
