C# 转换枚举 InvalidCastException 错误
Posted
技术标签:
【中文标题】C# 转换枚举 InvalidCastException 错误【英文标题】:C# Cast a enum InvalidCastException error 【发布时间】:2016-02-24 07:46:04 【问题描述】:所以我有这个使用 Firebird 的旧代码,我从那里获取代码,因为它运行良好,但在这里它没有。并抛出一个 InvalidCastException。
所以我在努力
animal.FeedScheduleType = (BcFeedScheduleType)drAnimal["feedschedule_type"];
所以我尝试从我的数据表中提取一些内容并将其放入 animal.FeedScheduleType。现在我的演员指向一个公共枚举
public enum BcFeedScheduleType
Default = 0,
FromList = 1,
Group = 2
而animal.FeedScheduleType是
private BcFeedScheduleType _feedScheduleType;
public BcFeedScheduleType FeedScheduleType
get return _feedScheduleType;
set _feedScheduleType = value;
但是每当它碰到这个时,它就会抛出 InvalidCastException 错误,我不知道为什么,我在这里搜索并用谷歌搜索,但找不到任何关于这样的演员表的信息。
编辑:数据库中的类型是一个整数
【问题讨论】:
数据库中记录的数据类型是什么? 我把它作为一个整数放入数据库中, 尝试使用声明为 var temp 的临时变量从数据库读取返回值,然后使用调试器检查从数据库返回的值是什么,然后再尝试任何强制转换。 谢谢,Tho Racil Hilan 他的回答成功了。 【参考方案1】:您是否尝试过先转换为 int?
animal.FeedScheduleType = (BcFeedScheduleType)(int)drAnimal["feedschedule_type"];
【讨论】:
我刚试过,但我害怕它会抛出同样的错误【参考方案2】:试试这个:
animal.FeedScheduleType = (BcFeedScheduleType)Convert.ToInt32(drAnimal["feedschedule_type"]);
这是fiddle。
【讨论】:
【参考方案3】:我的猜测是您的 drAnimal 返回的是字符串而不是 int。如果是这样的话,那么
animal.FeedScheduleType = (BcFeedScheduleType)Int.Parse(drAnimal["feedschedule_type"]);
如果您不确定 drAnimal 是什么类型,您可以执行以下操作:
var feedschedule_type = drAnimal["feedschedule_type"];
Console.WriteLine("feedschedule_type is 0", typeof(feedschedule_type));
基本上,您需要将其转换为 int,然后使用标准转换,就像您在问题中所做的那样。
最后,确保 Feed 计划类型的值有效。即,确保其值为 0、1 或 2。
【讨论】:
【参考方案4】:实际上我最近在使用SqlParameter
时遇到了这个问题。
我的猜测是drAnimal["feedschedule_type"]
被存储为SqlDbType.Int
或object
。为了转换我的参数,我必须执行类似于以下的操作:
(int)(SqlDbType.Int)(drAnimal["feedschedule_type"]);
您可能必须使用类似的链来获取实际的 int 值并将其强制转换为您的 Enum。
【讨论】:
是的,你是对的。但是,将 db 字段转换为整数的最佳方法是在字段不可为空时使用Convert.ToInt32(drAnimal["feedschedule_type"])
。如果可以为空,那么最好使用drAnimal["feedschedule_type"] as int?
。
可能,但如果类型在技术上是 SqlDbType.Variant
,Convert
会惨遭失败,因此是初始演员表。以上是关于C# 转换枚举 InvalidCastException 错误的主要内容,如果未能解决你的问题,请参考以下文章
C# 给枚举定义DescriptionAttribute,把枚举转换为键值对