【问题标题】:How to represent an Enum in an Interface?如何在接口中表示枚举?
【发布时间】:2010-07-09 20:30:12
【问题描述】:

当无法在接口中定义枚举时,如何定义一个接口,该接口的方法具有 Enum 作为参数?

因为Enum 不是引用类型,所以Object 类型不能用作传入参数的类型,那怎么办?

【问题讨论】:

    标签: c# enums interface


    【解决方案1】:
    public enum MyEnum
    {
      Hurr,
      Durr
    }
    
    public interface MyInterface
    {
      void MyMethod(MyEnum value);
    }
    

    如果这不是您所说的,请发表评论,以便人们了解您的问题所在。因为,虽然枚举没有在接口中定义,但这是一个完全正常且可接受的设计。

    【讨论】:

    • +1 我创建了一个 iEventLogTypes class 作为我的 IEventLog interface 的助手。现在它只包含一个enum,但我可以在我的界面中添加我需要的任何“类型”。我喜欢将枚举粘贴在“类似命名”的类中,以便枚举更紧密地绑定到特定接口,即使它在“仅名称”中。
    【解决方案2】:

    另一种解决方案可能是使用通用类型:

    public enum MyEnum
    {
        Foo,
        Bar
    }
    
    public interface IDummy<EnumType>
    {
        void OneMethod(EnumType enumVar);
    }
    
    public class Dummy : IDummy<MyEnum>
    {
        public void OneMethod(MyEnum enumVar)
        {
            // Your code
        }
    }
    

    此外,从 C# 7.3 开始,您可以添加通用约束以仅接受 Enum 类型:

    public interface IDummy<EnumType> where EnumType : Enum
    {
        void OneMethod(EnumType enumVar);
    }
    

    【讨论】:

      【解决方案3】:

      定义一个枚举就像定义一个类或定义一个接口。你可以把它放在你的一个类文件中,在命名空间内但在类定义之外,但是如果有几个类使用它,你把它放在哪一个,无论你选择哪个,你都会得到“类型名称与文件不匹配名称”警告。因此,“正确”的做法是将其放在自己的文件中,就像您将类或接口一样:

      MyEnum.cs

      namespace MyNamespace { internal enum MyEnum { Value1, Value2, Value3, Value4, Value5 }; } 然后命名空间内的任何接口或类都可以访问它。

      【讨论】:

        【解决方案4】:
        interface MyInterface
        {
            void MyMethod(Enum @enum);
        }
        

        【讨论】:

        • @ 是什么意思?我试图在 MSDN 中查找它......对不起,如果这看起来微不足道。我是创建接口的新手。
        • 期待您的问题:@enum 是变量的名称。该语法没有什么特别之处
        • @coffeeaddict:它允许您使用保留字作为参数名称。没有它,你会得到一个编译器错误(除非你将“枚举”重命名为别的东西)
        • 仍然 Enum 是在不同的命名空间中声明的类型。 Enum 类型尚未在接口外部声明。
        • 我想知道这个已接受的答案是否是发布此问题的用户正在寻找的?
        【解决方案5】:

        如果您谈论的是泛型接口以及 C# 不允许您将泛型类型限制为枚举这一事实,answers to this question 包含两种不同的解决方法。

        【讨论】:

        • 它确实有约束,你只是不能在接口内定义类型。与创建接口时一样,添加包含特定类型的命名空间,然后将其添加到参数或返回类型中。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多