【问题标题】:Referring to an enum value generically? [closed]泛指枚举值? [关闭]
【发布时间】:2016-02-11 02:28:40
【问题描述】:

我的应用程序中有多个enum,它们枚举了多种不同的机器状态。在某些时候,一个命令和一个状态被传递给一个 IO 类,该类应该简单地接受命令和枚举值(作为一个 int)并将其写入 IO 端口。

我正在尝试设计一个函数声明,它采用 enum 值,尽管不是来自特定的 enum。我知道我可以让它取一个 int 值并使用它,但我希望函数的用户被强制传递和 enum 值。这可能吗?

public void WriteCommand(String command, int value)  // Works technically
public void WriteCommand(String command, enum value) // Forces enum value to be passed

明确地说我有两个枚举

public enum MyEnum1 { VALUE1, VALUE2 };
public enum MyEnum2 { VALUE3, VALUE4 }; 

我希望能够像这样将每个枚举中的值传递给函数

WriteCommand("DoSomething", MyEnum1.VALUE1);
WriteCommand("DoSomething", MyEnum2.VALUE3);

收到后,我会将 enum 值转换为 int 以进行写入。

【问题讨论】:

  • 为什么不根据命令制作多个接口呢?它们都可以调用采用int 的相同(私有或其他)基本方法。
  • 为什么不坚持使用int value 而使用具有只读属性的静态类呢?例如,您可以将您的MyEnum1 替换为具有属性Value1, Value2 的相应静态类,并将您的整数分配给它。
  • 看看他的,也许你在找什么stackoverflow.com/questions/10021249/…
  • 所以 IO 类将实现多个接口(@98​​7654335@、ICommand2Writer 等),其中每个接口对命令 enum 类型都有特定的函数签名?我想这会起作用,我只是想减少代码,而不是添加更多接口。不过谢谢你的建议!

标签: c# enums


【解决方案1】:

只需更改您的代码

public void WriteCommand(String command, enum value) // Forces enum value to be passed

public void WriteCommand(String command, Enum value) // Forces enum value to be passed

你会很开心;-)

System.Enum 表示所有已创建枚举的基类。因此,您将能够传递任何已创建的枚举,但不能传递其他任何内容。

您还应该注意以下几点:

如果没有显式声明底层类型,则使用 Int32。

因此,您可能会捕获到基类不是Int32 的枚举。在这种情况下,您应该注意在将值写入设备之前如何解释和强制转换。

【讨论】:

    【解决方案2】:

    只需将参数设为Enum即可。

    【讨论】:

    • 那你看一下。 // 我也对doubleDoubleboolBoolean 的用法有些混淆。这个区别叫什么名字?为什么有些类型是大写的而有些不是?
    • @KDecker Enum 是类型的名称。 enum 是关键字,根本不是类型。
    • @KDecker doubleDouble 的别名,但正如Servy 所说,这不适用于enumEnum
    • 嗯,虽然我似乎无法将Enum 转换为int?编辑:Convert.ToInt32 看起来应该可以工作。
    • @KDecker 先把它转换成object
    【解决方案3】:

    如果你想严格一点:

     public void WriteCommand(String command, Enum value) 
        {
            Console.WriteLine(value.ToString());
        }
    

    或者更通用的,接受 int 和其他值类型

    public void WriteCommand<T>(String command, T value) where T : struct 
    {
        Console.WriteLine(value.ToString());
    }
    

    【讨论】:

    • 这在它所接受的方面甚至更多宽松。
    • @Servy 抱歉 - 有什么问题?
    • 你可以传递各种不是枚举的东西,它只需要接受枚举。
    • 好的,我误读了这个问题。认为他需要 2 个版本,采用 int 或 enums ..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多