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

.NET Core中如何将枚举映射为浮点数值

.NET Core中如何将枚举映射为浮点数值

嗨,这个需求其实在.NET Core里有几种很实用的实现方式,我给你整理几个常用的方案,你可以根据自己的场景来选择:

方案一:自定义特性+扩展方法(推荐,扩展性强)

这种方式最优雅,后续如果枚举新增成员,只需要给新成员加特性就行,不用改逻辑代码。

首先定义一个用来存储浮点数值的自定义特性:

[AttributeUsage(AttributeTargets.Field)]
public class NumericValueAttribute : Attribute
{
    public double Value { get; }

    public NumericValueAttribute(double value)
    {
        Value = value;
    }
}

然后给你的枚举成员加上这个特性:

public enum EventRange
{
    [NumericValue(1.0)]
    oneHour = 1,
    [NumericValue(1.5)]
    oneHourThirtyMinutes
}

接下来写一个枚举的扩展方法,用来读取特性里的数值:

public static class EventRangeExtensions
{
    public static double GetNumericValue(this EventRange range)
    {
        var fieldInfo = range.GetType().GetField(range.ToString());
        var attribute = fieldInfo?.GetCustomAttribute<NumericValueAttribute>();
        
        // 如果没找到特性,可根据需求返回默认值或抛出异常
        return attribute?.Value ?? throw new InvalidOperationException($"No NumericValueAttribute defined for {range}");
    }
}

使用时很简单:

EventRange range = EventRange.oneHour;
double value = range.GetNumericValue(); // 得到1.0

range = EventRange.oneHourThirtyMinutes;
value = range.GetNumericValue(); // 得到1.5

方案二:字典映射(简单直接)

如果枚举成员不多且不会频繁新增,用字典映射最省事:

public static class EventRangeHelper
{
    private static readonly Dictionary<EventRange, double> _rangeMap = new Dictionary<EventRange, double>
    {
        { EventRange.oneHour, 1.0 },
        { EventRange.oneHourThirtyMinutes, 1.5 }
    };

    public static double GetValue(EventRange range)
    {
        // 用TryGetValue避免键不存在的异常
        if (_rangeMap.TryGetValue(range, out double value))
        {
            return value;
        }
        throw new ArgumentOutOfRangeException(nameof(range), "Invalid EventRange value");
    }
}

调用方式:

double value = EventRangeHelper.GetValue(EventRange.oneHourThirtyMinutes); // 得到1.5

方案三:Switch语句(基础易懂)

最基础的实现方式,适合枚举结构简单、几乎不会变动的场景:

public static double GetEventRangeValue(EventRange range)
{
    return range switch
    {
        EventRange.oneHour => 1.0,
        EventRange.oneHourThirtyMinutes => 1.5,
        _ => throw new ArgumentOutOfRangeException(nameof(range), "Unsupported EventRange value")
    };
}

或者用传统switch写法:

public static double GetEventRangeValue(EventRange range)
{
    switch (range)
    {
        case EventRange.oneHour:
            return 1.0;
        case EventRange.oneHourThirtyMinutes:
            return 1.5;
        default:
            throw new ArgumentOutOfRangeException(nameof(range), "Unsupported EventRange value");
    }
}

这几种方案里,自定义特性的方式最灵活,字典和switch适合简单场景,你可以根据项目情况来选~

备注:内容来源于stack exchange,提问作者Saidur Rahman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 11:39:12