c# - 如何使类型明确地转换为任何枚举
问题描述
我有
struct MyType
{
public int value;
}
我如何定义一个explicit
运算符,以便它可以转换为 any enum
?“任何”是指存在的任何枚举。
如果“可转换为任何可能的枚举”函数是一个int
而不是一个struct
包含的,则它已经是可能的int
。例如,我总是可以(AnyEnum)myType.value
,(SomeOtherEnum)myType.value
。但我希望能够在(AnyEnum)myType
不挖掘int
内部的情况下直接进行。我的想法是自然地,implicit
以某种方式将整个事情视为int
. 但不幸implicit
的是不支持泛型,所以我必须为implicit
我希望支持的每个枚举定义。
如果这涉及到 C# 7.3 的Enum
通用约束的一些使用,那很好。但似乎即使有约束,我where T : Enum
也无法int
通过。("无法将类型转换为)T
(T)value
int
T
一个示例用例:
if(myValue.something == something)
{
switch((MyEnum)myValue)
{
case MyEnum.A : ...
case MyEnum.B : ...
}
}
else if(myValue.something == something)
{
switch((MyOtherEnum)myValue)
{
case MyOtherEnum.A : ...
case MyOtherEnum.B : ...
}
}
另一个,
if(myValue.ValidInEnum<MyEnum>(out MyEnum validEnum)) //converted from inside with some additional logic
{
switch(validEnum)
{
case MyEnum.A : ...
case MyEnum.B : ...
}
}
解决方案
如果您想直接从枚举转换而不是访问结构的“值”成员,是的,有可能,这里有一个例子:
static void Main(string[] args)
{
MyType myType;
myType.value = 1;
MyEnum myEnum = (MyEnum) myType;
Console.WriteLine(myEnum);
Console.ReadLine();
}
enum MyEnum
{
a = 0,
b = 1
}
struct MyType
{
public int value;
public static explicit operator MyEnum(MyType myType)
{
return (MyEnum)myType.value;
}
}
输出是:
b
如果您想从任何类型的枚举直接转换为您的结构,我认为这是不可能的,您可以按照其他答案中的建议查看泛型,或者为您的类型编写一个小扩展助手:
public static class MyTypeExtensions
{
public static T ToAnyEnum<T>(this MyType myType)
{
return (T)Enum.ToObject(typeof(T), myType.value);
}
}
然后你可以写:
MyType myType;
myType.value = 1;
MyEnum myEnum = myType.ToAnyEnum<MyEnum>();
MyOtherEnum myOtherEnum = myType.ToAnyEnum<MyOtherEnum>();
推荐阅读
- python - 将值传递给 Python 中的另一个函数?
- tensorflow - 通过 huggingface tokenizer 映射文本数据
- node.js - 未设置 Set-Cookie 标头中的 Cookie
- python - 如何决定在模块类中继承什么?
- javascript - 不能在反应中使用 setinterval() 附加数组(状态元素)
- ios - 我尝试使用 iOS 中的应用程序组在通知服务扩展和主应用程序之间共享数据
- php - Symfony 2.8 - 如何处理 formBuilder 和实体文件中不同列的数据类型
- hibernate - JPA @MapsID 出现错误 org.hibernate.TransientPropertyValueException:对象引用了未保存的瞬态实例
- sql - 您可以在列表达式中使用“In”运算符吗?
- react-native - 未在 dev 中导入的文件的 React-Native Source-Maps