C# 如何在C中创建一个可以转换为枚举的新数值类型#
我正试图用C#编写一个侏儒解析器。DWARF具有多个数字类型的概念(C# 如何在C中创建一个可以转换为枚举的新数值类型#,c#,enums,interface,casting,C#,Enums,Interface,Casting,我正试图用C#编写一个侏儒解析器。DWARF具有多个数字类型的概念(DW\u FORM\u data2,DW\u FORM\u data4,DW\u FORM\u data8,DW\u FORM\u sdata),它们都可以解析为枚举类型。我想制作一个IConstant,上面提到的DW\u FORM.*类实现了它,您可以将它强制转换为枚举(就像您可以将ushort,int等强制转换为枚举一样) 然而,强制转换运算符是一种静态方法,我不能将其放在枚举上。如何制作一组可以转换为枚举的数字类型?一个复
DW\u FORM\u data2
,DW\u FORM\u data4
,DW\u FORM\u data8
,DW\u FORM\u sdata
),它们都可以解析为枚举类型。我想制作一个IConstant
,上面提到的DW\u FORM.*
类实现了它,您可以将它强制转换为枚举(就像您可以将ushort
,int
等强制转换为枚举一样)
然而,强制转换运算符是一种静态方法,我不能将其放在枚举上。如何制作一组可以转换为枚举的数字类型?一个复杂的因素是
DW\u-FORM\u-udata
或DW\u-FORM\u-sdata
数字的大小(8位、32位等)直到解码后才定义。您可以创建一个简单的接口(不确定IConstant
是否是最佳名称):
在不了解类的详细信息的情况下,如果可能的话,很难说使用一个具有单个实现的抽象类是否会更好。您是否希望能够强制转换到任何
枚举
?为什么要强制转换,而不只是使用一个方法进行转换?是的。任何枚举。也许有一种方法是可行的。那么只需在接口上添加一个ToEnum()
方法?这可能就是我想要的答案。你会使ToEnum
泛型吗?@DavidG一个方法如何转换成任何可用的enum
,就像你可以将int
转换成任何enum
?这是你必须在C语言中做的事情,因为它不能保证内置类型的大小。每个库都必须声明自己的类型别名,这给每个库带来了负担,有成千上万种方式可以说“我使用的是32位无符号类型”。我可能是在低调行事。他们终于闻到了咖啡的味道,加上了stdint.h,对侏儒来说太晚了。在C#中不是问题,UInt32总是无符号的,并且总是需要4个字节。这与接口无关。在我的例子中,这非常有效。谢谢特别是因为不同的“常量”类型将转换为不同的C#numeric类型。侏儒把它们都归为“常量”类——这就是为什么我这么叫它们。
public interface IConstant {
TEnum ToEnum<TEnum>();
}
public TEnum ToEnum<TEnum>() {
return (TEnum)Enum.ToObject(typeof(TEnum), Value);
}
var ev = data8.ToEnum<TestEnum>();