如何在接口中表示枚举?

36

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

由于Enum不是引用类型,因此不能将Object类型用作传入参数的类型,那么怎么办呢?

6个回答

50
public enum MyEnum
{
  Hurr,
  Durr
}

public interface MyInterface
{
  void MyMethod(MyEnum value);
}

如果这不是您要做的事,请留下评论,以便人们了解您的问题所在。因为,虽然枚举类型没有在接口内定义,但这是一种完全正常和可接受的设计。


+1 我创建了一个名为 iEventLogTypes 的 class,作为 IEventLog interface 的辅助类。目前它只包含一个 enum,但我可以在我的 interface 中添加任何需要的 "types"。我喜欢将枚举放在一个“类名相似”的类中,这样即使仅仅是名称上的绑定,枚举也会更紧密地与特定的接口相关联。 - franji1
我不知道为什么,但我从来没有想过在类声明之外,在命名空间内创建枚举。 - Reahreic

24
interface MyInterface
{
    void MyMethod(Enum @enum);
}

4
“@”符号是用来在C#中引用命名空间或者指定特殊的编译器行为。你在MSDN上查到这个信息了吗?如果没有,不要担心,作为一个新手创建接口是需要时间适应的。 - PositiveGuy
11
预料到你的问题:@enum是变量的名称。这种语法没有什么特别之处。 - BlueRaja - Danny Pflughoeft
34
它允许你将保留字用作参数名。如果没有它,你会得到一个编译器错误(除非你将"enum"重命名为其他名称)。 - Reed Copsey
1
枚举类型仍然是在不同的命名空间中声明的。 枚举类型仍然未在接口外部声明。 - Lucas Locatelli
我在想这个被接受的答案是否符合发布此问题的用户所寻找的答案? - Carthic

10

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

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版本以来,您可以添加一个泛型约束来仅接受枚举类型:
public interface IDummy<EnumType> where EnumType : Enum
{
    void OneMethod(EnumType enumVar);
}

3
定义枚举类型就像定义类或接口一样。你可以将其放在命名空间内的一个类文件中,但如果多个类使用它,那么你应该将其放在哪个类中呢?无论你选择哪个类,都会得到“类型名称与文件名不匹配”的警告。所以,“正确”的方法是将其放在自己的文件中,就像你会为类或接口做的那样:
MyEnum.cs
namespace MyNamespace { internal enum MyEnum { Value1, Value2, Value3, Value4, Value5 }; }
然后命名空间内的任何接口或类都可以访问它。

0

你必须在两个方面实现枚举并引用接口命名空间,例如:

public interface IConfigProvider
{
    enum OUType
    {
        Prop1,
        Prop2
    };


    string GetConfig(OUType outType);
}

public class ConfigProvider
{
    enum OUType
    {
       Prop1,
       Prop2
    };
    
    public string GetConfig(IConfigProvider.OUType outType)
    {
        ...
    }
    
}

使用方法:

configProvider.GetConfig(IConfigProvider.OUType.Prop1)

0

如果你在谈论通用接口以及C#不允许你将泛型类型限制为枚举类型,那么这个问题的答案中包含两种不同的解决方法。


它确实有限制,你只是不能在接口内定义类型。 与创建接口时相同,添加一个包含特定类型的命名空间,然后将其添加到参数或返回类型中。 - Lucas Locatelli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接