C# 如何在接口中使用枚举?

C# 如何在接口中使用枚举?,c#,asp.net-core,enums,interface,multi-tier,C#,Asp.net Core,Enums,Interface,Multi Tier,因此,我们有Order这是逻辑,而IOrderData在涉及类似数据的属性时连接视图和逻辑Order具有enumsPayMethod和OrderStatus的属性。在接口层既不知道逻辑也不知道视图的情况下,如何在IOrderData中创建PayMethod和OrderStatus的属性 例如: 项目逻辑: public class Order : IOrder, IOrderData { public enum PayMethod { iDeal,

因此,我们有
Order
这是逻辑,而
IOrderData
在涉及类似数据的属性时连接视图和逻辑
Order
具有enums
PayMethod
OrderStatus
的属性。在接口层既不知道逻辑也不知道视图的情况下,如何在
IOrderData
中创建
PayMethod
OrderStatus
的属性

例如:

项目逻辑:

public class Order : IOrder, IOrderData
{
    public enum PayMethod
    {
        iDeal,
        creditcard,
        PayPal
    }

    public enum OrderStatus
    {
        NotPaid,
        InTheMaking,
        Shipped,
        Delivered,
        Confirmed
    }

public OrderStatus Status { get; set; }
public PayMethod Paymethod { get; set; }
项目数据接口:

public interface IOrderData
{
    public OrderStatus Status { get; set; } //doesn't work
    public PayMethod Paymethod { get; set; } //doesn't work
}

我的解决方案:我刚刚为
enum
创建了一个新的类库,其中包含
PayMethod
OrderStatus
类,在使用enum的任何地方,我都引用了类库。

此代码不会编译,因为您的enum是
Order
类的成员。 如果将它们移出类并使其成为命名空间的顶级成员,如中所述:

通常,最好直接在名称空间中定义
枚举
,以便名称空间中的所有类都能以同样的便利性访问它。但是,
enum
也可以嵌套在类或结构中

这将解决问题:

public enum PayMethod
{
    iDeal,
    creditcard,
    PayPal
}

public enum OrderStatus
{
    NotPaid,
    InTheMaking,
    Shipped,
    Delivered,
    Confirmed
}

您的枚举是顺序的子类型,因此必须使用顺序对名称进行完全限定。如下:

public interface IOrderData
{
    Order.OrderStatus Status { get; set; }
    Order.PayMethod Paymethod { get; set; }
}
另外,
public
不适用于C#7.3及以下版本中的接口成员(参见C#8+)


或者,您可以将枚举移到类声明的
外部,如中所述。

将枚举的声明移到类声明的外部,否则接口将不知道有关该枚举的任何信息

public enum PayMethod
{
    iDeal,
    creditcard,
    PayPal
}

public enum OrderStatus
{
    NotPaid,
    InTheMaking,
    Shipped,
    Delivered,
    Confirmed
}

public class Order : IOrderData
{
    public OrderStatus Status { get; set; }
    public PayMethod Paymethod { get; set; }
}

public interface IOrderData
{
    OrderStatus Status { get; set; }
    PayMethod Paymethod { get; set; }
}

我的命名空间的顶级成员。那么,这是否意味着将其置于名称空间之上,或者为Enum创建一个全新的项目?@Zheng rongCai如果Enum是接口的一部分,通常您会将它们的定义放在与接口本身相同的源代码文件中。这意味着将它们直接放在名称空间之下,而不是像问题中的代码那样放在类内部。您不需要另一个项目来将它们放入。但是接口无法知道逻辑(枚举所在的位置),因此它仍然会给出错误Enums not Logic。它们只是一组常数。接口也不是逻辑,它只是一个契约。所有逻辑都在实现接口的类型上。
public enum PayMethod
{
    iDeal,
    creditcard,
    PayPal
}

public enum OrderStatus
{
    NotPaid,
    InTheMaking,
    Shipped,
    Delivered,
    Confirmed
}

public class Order : IOrderData
{
    public OrderStatus Status { get; set; }
    public PayMethod Paymethod { get; set; }
}

public interface IOrderData
{
    OrderStatus Status { get; set; }
    PayMethod Paymethod { get; set; }
}