.NET Core 6中如何在Proto文件中映射枚举?
枚举映射问题:.NET Core模型到Protobuf生成类的枚举转换
现有代码结构
.NET Core 6模型类
using StackExchange.Redis; using System; using System.Collections.Generic; using Ucdp.Common.Enums.Vendor; namespace Ucdp.Common.Industry { public class VendorBasicDetailsByChannelModel { public Guid Id { get; set; } public string Name { get; set; } public VendorMode VendorMode { get; set; } } }
对应的VendorMode枚举
using System; using System.Collections.Generic; using System.Text; namespace Ucdp.Common.Enums.Vendor { public enum VendorMode { Shopping = 1, Discovery = 2, ShoppingAndDiscovery = 3 } }
Protobuf定义文件(vendor.proto)
syntax = "proto3"; option csharp_namespace = "IndustryAPI.Protos"; import "google/protobuf/wrappers.proto"; message ListOfStrings { repeated string strings = 1; } enum VendorMode { VendorMode_UNSPECIFIED = 0; Shopping = 1; Discovery = 2; ShoppingAndDiscovery = 3; } message VendorModel { string Id = 1; string Name = 2; VendorMode VendorMode = 3; } service VendorService { rpc GetVendorBasicDetails(GetVendorBasicDetailsRequest) returns (GetVendorBasicDetailsResponse); } // requests message GetVendorBasicDetailsRequest { string channelId = 1; string VendorCreatedDateStart = 2; string VendorCreatedDateEnd = 3; } message GetVendorBasicDetailsResponse { repeated VendorModel Vendor = 1; }
当前尝试的映射代码
你当前直接赋值枚举的代码会编译报错,因为两个VendorMode分别属于Ucdp.Common.Enums.Vendor和IndustryAPI.Protos不同命名空间,是完全独立的类型:
var Vendor = new VendorModel { Id = vendor.Id.ToString(), Name = vendor.Name, VendorMode = vendor.VendorMode // 此处报错:无法将'Ucdp.Common.Enums.Vendor.VendorMode'转换为'IndustryAPI.Protos.VendorMode' };
枚举映射的解决方案
由于两个枚举的枚举值名称和数值完全匹配,可以通过以下几种方式完成转换:
方式1:强制类型转换(最简单高效)
直接将原枚举强制转换为Protobuf生成的枚举类型,因为两者数值一致:
var vendorModel = new IndustryAPI.Protos.VendorModel { Id = vendor.Id.ToString(), Name = vendor.Name, VendorMode = (IndustryAPI.Protos.VendorMode)vendor.VendorMode };
注意:需要明确指定Protobuf枚举的完整命名空间,避免和原枚举类型冲突
方式2:使用Enum.Parse(更安全,适配名称匹配)
如果担心后续枚举的数值或定义有变动,基于枚举名称进行转换的方式更可靠,同时能在出现未定义值时抛出异常:
var vendorModel = new IndustryAPI.Protos.VendorModel { Id = vendor.Id.ToString(), Name = vendor.Name, VendorMode = Enum.Parse<IndustryAPI.Protos.VendorMode>(vendor.VendorMode.ToString()) };
方式3:扩展方法(复用性强)
如果多处需要进行这种枚举转换,可以给原枚举添加扩展方法,简化调用:
using Ucdp.Common.Enums.Vendor; using IndustryAPI.Protos; public static class VendorModeExtensions { public static IndustryAPI.Protos.VendorMode ToProtoVendorMode(this VendorMode source) { // 可选:强制转换或Enum.Parse方式 return (IndustryAPI.Protos.VendorMode)source; // return Enum.Parse<IndustryAPI.Protos.VendorMode>(source.ToString()); } }
使用时只需调用扩展方法:
var vendorModel = new IndustryAPI.Protos.VendorModel { Id = vendor.Id.ToString(), Name = vendor.Name, VendorMode = vendor.VendorMode.ToProtoVendorMode() };
内容的提问来源于stack exchange,提问作者Dilakshan AT
相关产品推荐
相关产品推荐

