是否可以在C#中定义枚举的隐式转换?什么可以实现这一目标?public enum MyEnum{ one = 1, two = 2}MyEnum number = MyEnum.one;long i = number;如果没有,为什么不呢? 最佳答案 有一个解决方案。考虑以下:public sealed class AccountStatus{ public static readonly AccountStatus Open = new AccountStatus(1); public static readonly AccountStatus Closed = new AccountStatus(2); public static readonly SortedList<byte, AccountStatus> Values = new SortedList<byte, AccountStatus>(); private readonly byte Value; private AccountStatus(byte value) { this.Value = value; Values.Add(value, this); } public static implicit operator AccountStatus(byte value) { return Values[value]; } public static implicit operator byte(AccountStatus value) { return value.Value; }}上面提供了隐式转换: AccountStatus openedAccount = 1; // Works byte openedValue = AccountStatus.Open; // Works这比声明一个普通的枚举要花更多的功夫(尽管您可以将上述内容重构为一个通用的通用基类)。通过使基类实现IComparable和IEquatable,以及添加方法以返回DescriptionAttributes的值,声明的名称等,您可以走得更远。我编写了一个基类(RichEnum )来处理大多数艰苦的工作,这使上面的枚举声明简化为:public sealed class AccountStatus : RichEnum<byte, AccountStatus>{ public static readonly AccountStatus Open = new AccountStatus(1); public static readonly AccountStatus Closed = new AccountStatus(2); private AccountStatus(byte value) : base (value) { } public static implicit operator AccountStatus(byte value) { return Convert(value); }}下面列出了基类(RichEnum)。using System;using System.Collections.Generic;using System.ComponentModel;using System.Diagnostics;using System.Linq;using System.Reflection;using System.Resources;namespace Ethica{ using Reflection; using Text; [DebuggerDisplay("{Value} ({Name})")] public abstract class RichEnum<TValue, TDerived> : IEquatable<TDerived>, IComparable<TDerived>, IComparable, IComparer<TDerived> where TValue : struct , IComparable<TValue>, IEquatable<TValue> where TDerived : RichEnum<TValue, TDerived> { #region Backing Fields /// <summary> /// The value of the enum item /// </summary> public readonly TValue Value; /// <summary> /// The public field name, determined from reflection /// </summary> private string _name; /// <summary> /// The DescriptionAttribute, if any, linked to the declaring field /// </summary> private DescriptionAttribute _descriptionAttribute; /// <summary> /// Reverse lookup to convert values back to local instances /// </summary> private static SortedList<TValue, TDerived> _values; private static bool _isInitialized; #endregion #region Constructors protected RichEnum(TValue value) { if (_values == null) _values = new SortedList<TValue, TDerived>(); this.Value = value; _values.Add(value, (TDerived)this); } #endregion #region Properties public string Name { get { CheckInitialized(); return _name; } } public string Description { get { CheckInitialized(); if (_descriptionAttribute != null) return _descriptionAttribute.Description; return _name; } } #endregion #region Initialization private static void CheckInitialized() { if (!_isInitialized) { ResourceManager _resources = new ResourceManager(typeof(TDerived).Name, typeof(TDerived).Assembly); var fields = typeof(TDerived) .GetFields(BindingFlags.Static | BindingFlags.GetField | BindingFlags.Public) .Where(t => t.FieldType == typeof(TDerived)); foreach (var field in fields) { TDerived instance = (TDerived)field.GetValue(null); instance._name = field.Name; instance._descriptionAttribute = field.GetAttribute<DescriptionAttribute>(); var displayName = field.Name.ToPhrase(); } _isInitialized = true; } } #endregion #region Conversion and Equality public static TDerived Convert(TValue value) { return _values[value]; } public static bool TryConvert(TValue value, out TDerived result) { return _values.TryGetValue(value, out result); } public static implicit operator TValue(RichEnum<TValue, TDerived> value) { return value.Value; } public static implicit operator RichEnum<TValue, TDerived>(TValue value) { return _values[value]; } public static implicit operator TDerived(RichEnum<TValue, TDerived> value) { return value; } public override string ToString() { return _name; } #endregion #region IEquatable<TDerived> Members public override bool Equals(object obj) { if (obj != null) { if (obj is TValue) return Value.Equals((TValue)obj); if (obj is TDerived) return Value.Equals(((TDerived)obj).Value); } return false; } bool IEquatable<TDerived>.Equals(TDerived other) { return Value.Equals(other.Value); } public override int GetHashCode() { return Value.GetHashCode(); } #endregion #region IComparable Members int IComparable<TDerived>.CompareTo(TDerived other) { return Value.CompareTo(other.Value); } int IComparable.CompareTo(object obj) { if (obj != null) { if (obj is TValue) return Value.CompareTo((TValue)obj); if (obj is TDerived) return Value.CompareTo(((TDerived)obj).Value); } return -1; } int IComparer<TDerived>.Compare(TDerived x, TDerived y) { return (x == null) ? -1 : (y == null) ? 1 : x.Value.CompareTo(y.Value); } #endregion public static IEnumerable<TDerived> Values { get { return _values.Values; } } public static TDerived Parse(string name) { foreach (TDerived value in _values.Values) if (0 == string.Compare(value.Name, name, true) || 0 == string.Compare(value.DisplayName, name, true)) return value; return null; } }}
09-05 22:22