3
在protobuf-net,你可以用ProtoEnumAttribute
覆蓋爲枚舉線格式,像這樣:模仿ProtoEnumAttribute與ProtoBuf.Meta接口
[ProtoContract]
enum MyEnum
{
[ProtoEnum(Value=1)]
Default,
[ProtoEnum(Value=10)]
Foo
}
有了這些屬性,其中Default
通常會序列化到0
和Foo
到1
他們現在將分別序列化爲1
和10
。
我想要做的就是使用ProtoBuf.Meta
中的接口模仿這種行爲,所以我不必註釋枚舉(因爲我通常不會在我的項目中控制它們)。
通過protobuf網的源挖掘,我已經成功地得到以下(簡化了一下)工作:(!只讀)
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在運行時的枚舉線值?
不,你得到「無法確定成員:默認」。看起來像Add/AddField只考慮實例成員。 –
@Kevin k;將在24小時內修復並重新部署。直到現在我的手肘部分電腦(不是我的主電腦,幸運的是!) –
@Kevin修補並推送;見2.0.0.612 –