You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 10:28:13