.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
相关产品推荐
相关产品推荐

