【发布时间】:2010-07-09 20:30:12
【问题描述】:
当无法在接口中定义枚举时,如何定义一个接口,该接口的方法具有 Enum 作为参数?
因为Enum 不是引用类型,所以Object 类型不能用作传入参数的类型,那怎么办?
【问题讨论】:
当无法在接口中定义枚举时,如何定义一个接口,该接口的方法具有 Enum 作为参数?
因为Enum 不是引用类型,所以Object 类型不能用作传入参数的类型,那怎么办?
【问题讨论】:
public enum MyEnum
{
Hurr,
Durr
}
public interface MyInterface
{
void MyMethod(MyEnum value);
}
如果这不是您所说的,请发表评论,以便人们了解您的问题所在。因为,虽然枚举没有在接口中定义,但这是一个完全正常且可接受的设计。
【讨论】:
class 作为我的 IEventLog interface 的助手。现在它只包含一个enum,但我可以在我的界面中添加我需要的任何“类型”。我喜欢将枚举粘贴在“类似命名”的类中,以便枚举更紧密地绑定到特定接口,即使它在“仅名称”中。
另一种解决方案可能是使用通用类型:
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);
}
【讨论】:
定义一个枚举就像定义一个类或定义一个接口。你可以把它放在你的一个类文件中,在命名空间内但在类定义之外,但是如果有几个类使用它,你把它放在哪一个,无论你选择哪个,你都会得到“类型名称与文件不匹配名称”警告。因此,“正确”的做法是将其放在自己的文件中,就像您将类或接口一样:
MyEnum.cs
namespace MyNamespace
{
internal enum MyEnum { Value1, Value2, Value3, Value4, Value5 };
}
然后命名空间内的任何接口或类都可以访问它。
【讨论】:
interface MyInterface
{
void MyMethod(Enum @enum);
}
【讨论】:
@enum 是变量的名称。该语法没有什么特别之处
如果您谈论的是泛型接口以及 C# 不允许您将泛型类型限制为枚举这一事实,answers to this question 包含两种不同的解决方法。
【讨论】: