C# 为什么我不能将整数强制转换为枚举
我正在尝试从DataGridViewRow单元格值强制转换一个整数,我已确认该值等于0 AddedTask.Status=TaskStatus行。单元格[Status]。值 下面是创建Task对象和TaskStatus枚举的代码C# 为什么我不能将整数强制转换为枚举,c#,enums,C#,Enums,我正在尝试从DataGridViewRow单元格值强制转换一个整数,我已确认该值等于0 AddedTask.Status=TaskStatus行。单元格[Status]。值 下面是创建Task对象和TaskStatus枚举的代码 class Task { public string Description { get; set; } public TimeSpan Duration { get { if (Begi
class Task
{
public string Description { get; set; }
public TimeSpan Duration
{
get
{
if (BeginDate == DateTime.MinValue) // BeginDate has not been set
return new TimeSpan(0, 0, 0);
else if (EndDate == DateTime.MinValue)
return DateTime.Now.Subtract(this.BeginDate);
else
return this.EndDate.Subtract(this.BeginDate);
}
}
public DateTime BeginDate { get; set; }
public DateTime EndDate { get; set; }
public TaskStatus Status { get; set; }
public Task()
{
this.Description = string.Empty;
this.BeginDate = new DateTime();
this.EndDate = new DateTime();
this.Status = TaskStatus.UNINVOICED;
}
}
public enum TaskStatus
{
UNINVOICED,
INVOICED,
PAID
}
这是可行的,但如果这是我可能要退休的唯一方法
AddedTask.Status = (TaskStatus) Enum.Parse(typeof(TaskStatus), row.Cells["status"].Value.ToString());
我进行了一点测试,发现如果原始值是Int32,则转换成功,但如果是Int64或字节,则转换失败 我的建议解决方案是在强制转换之前使用Convert.ToInt32:
AddedTask.Status = (TaskStatus) Convert.ToInt32(row.Cells["status"].Value);
发件人:
枚举是一组命名常量,其基础类型为任何整数类型。如果没有显式声明基础类型,则使用Int32
因此,您的TaskStatus枚举是从Int32派生的,任何其他整数类型的直接强制转换都将失败。作为一种更通用的方法,您可以创建自定义方法,将所有数值类型转换为所需的任何枚举类型:
static TEnum GetEnum<TEnum>(object obj)
where TEnum : struct, IConvertible
{
if (!typeof(TEnum).IsEnum)
throw new ArgumentException("TEnum must be an enumerated type");
return (TEnum)(IConvertible)(Convert.ToInt32(obj));
}
其用法的简单示例:
enum Planet { Sun = 0, Moon = 1 }
enum Abc { Abc5 = 0, Abc30 = 1 }
private static void Main(string[] args)
{
var x = GetEnum<Planet>((long) 0);
var y = GetEnum<Abc>((double)1);
Console.Write(x);
Console.Write(", " + y);
}
输出:Sun,Abc30作为旁注。使用枚举时,应该使用该枚举的字符串,通过服务进行持久化或公开时
var value = TaskStatus.UNINVOICED;
var x = value.ToString();
var reversed = (TaskStatus)Enum.Parse(typeof(TaskStatus), x);
您希望持久化的原因是,您可以在将来修改枚举。如果在第1天,您的枚举如下所示:
public enum TaskStatus
{
UNINVOICED,
INVOICED,
PAID
}
public enum TaskStatus
{
NOTSET,
UNINVOICED,
INVOICED,
SOMEOTHERSTATUSBETWEENINVOICEDANDPAID,
PAID
}
未开票的int值可能为0,开票的int值可能为1,已付款的int值可能为2
然后,如果需要将枚举更新为以下内容:
public enum TaskStatus
{
UNINVOICED,
INVOICED,
PAID
}
public enum TaskStatus
{
NOTSET,
UNINVOICED,
INVOICED,
SOMEOTHERSTATUSBETWEENINVOICEDANDPAID,
PAID
}
然后,所有持久化的数据都将被重新定义,如果由int完成的话。曾经未发出声音的数据现在将转换为NOTSET,曾经支付的数据现在将被开具发票
如果通过服务接口公开,则根据技术的不同,它将以不同的方式分配枚举元素的int值
也就是说,通过Web引用公开的枚举将不会具有与通过服务引用公开的枚举相同的int值
始终将枚举持久化为字符串,并始终按枚举或字符串传递/转换它。您可以检查.Cells[status].Value.GetType.FullName返回的行吗?它返回System.Int64@Kookizt。这意味着您必须在强制转换为枚举之前将其取消装箱到long。也就是说,RenéVogt的答案是优雅和安全的。我将看看是否可以在SQLite数据库中指定32位整数而不是64位整数。Thanke.DataGridViewColumn.ValueType=TypeOfIt不幸地没有强制转换数据类型,因此我仍然需要使用Convert.ToInt32。能否创建一个Int64的枚举?即。public enum TaskStatus:long?@ChrisDunaway我是afk,只需尝试一下: