我需要一个辅助方法来比较char Enum和装箱到对象的char
时间:2020-03-06 14:27:50 来源:igfitidea点击:
我有一个看起来如下的枚举:
public enum TransactionStatus { Open = 'O', Closed = 'C'};
并且我正在使用一个字符从数据库中提取数据,表明我们猜测是打开交易" O"还是关闭交易" C"。
现在,因为数据是作为对象从数据库中输出的,所以我很难编写比较代码。
我能做的最好的就是写:
protected bool CharEnumEqualsCharObj(TransactionStatus enum_status, object obj_status) { return ((char)enum_status).ToString() == obj_status.ToString(); }
但是,这不是我必须处理的唯一字符枚举,我有5或者6个字符,并且为他们编写相同的方法至少可以说令人讨厌。假设所有枚举都继承自System.Enum,但是如果我尝试将其设置为输入类型,则会出现编译错误。在.NET 1.1中也是如此,因此泛型就不存在了。
我已经为此苦苦挣扎了一段时间。有没有人有更好的方法来编写此方法?另外,有人可以澄清整个枚举是否继承自System.Enum,但不是多态的吗?
解决方案
我来看看Enum.Parse。它将使我们将char解析回适当的枚举。我相信它可以一直工作到C1.0。代码看起来像这样:
TransactionStatus status = (TransactionStatus)Enum.Parse(typeof(TransactionStatus), obj.ToString());
在使用.NET 2.0的Cso中,枚举通常比较混乱,它的常见用法是使用泛型来包装语法,以避免不得不编写此类笨拙的代码。
在.NET 1.1中,我们可以执行以下操作,尽管它不如原始代码段那么整洁:
protected bool CharEnumEqualsCharObj(TransactionStatus enum_status, object obj_status) { return (enum_status == Enum.Parse(typeof(TransactionStatus), obj_status.ToString())); }
这大约是相同数量的代码,但是我们现在正在执行枚举而不是字符串比较。
我们还可以使用调试器/文档查看obj_status是否确实是一个对象,或者是否可以安全地将其强制转换为字符串。
如果我们只需要比较值,则可以使用以下方法:
protected bool CharEnumEqualsCharObj(TransactionStatus enum_status, object obj_status) { return (char)enum_status == (char)obj_status; }
static void Main(string[] args) { object val = 'O'; Console.WriteLine(EnumEqual(TransactionStatus.Open, val)); val = 'R'; Console.WriteLine(EnumEqual(DirectionStatus.Left, val)); Console.ReadLine(); } public static bool EnumEqual(Enum e, object boxedValue) { return e.Equals(Enum.ToObject(e.GetType(), (char)boxedValue)); } public enum TransactionStatus { Open = 'O', Closed = 'C' }; public enum DirectionStatus { Left = 'L', Right = 'R' };