如何在接口中使用枚举?

时间:2019-11-25 08:25:37

标签: c# asp.net-core enums interface multi-tier

因此,当涉及诸如属性之类的数据时,我们有Order就是逻辑,而IOrderData则连接了视图和逻辑。 Order具有枚举PayMethodOrderStatus的属性。如何在接口层不了解逻辑和视图的情况下在PayMethod中创建OrderStatusIOrderData的属性?

示例:

项目逻辑:

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
}

我的解决方案:我刚刚为Enums创建了一个新的类库,其中包含PayMethodOrderStatus类,在我们使用枚举的所有地方,我都引用了类库。 >

3 个答案:

答案 0 :(得分:3)

该代码无法编译,因为您的枚举是Order类的成员。 如果将它们移到类之外,并使其成为命名空间的顶级成员,如official documentation中所述:

  

通常,最好直接在名称空间内定义一个enum,以便该名称空间中的所有类都可以以相同的方便性进行访问。但是,enum也可以嵌套在类或结构中。

这将解决问题:

public enum PayMethod
{
    iDeal,
    creditcard,
    PayPal
}

public enum OrderStatus
{
    NotPaid,
    InTheMaking,
    Shipped,
    Delivered,
    Confirmed
}
public interface IOrderData
{
    OrderStatus Status { get; set; } 
    PayMethod Paymethod { get; set; }
}
public class Order : IOrder, IOrderData
{

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

答案 1 :(得分:1)

您的枚举是Order的子类型,因此您必须像这样用Order.来完全限定名称:

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

public也不适用于C#7.3及以下版本的接口成员(有关C#8+,请参见this question)。

或者,您可以将枚举移动到Order类之外,如this other answer中所述。

答案 2 :(得分:1)

将枚举的声明移到类声明的外部之外,否则接口将不了解该枚举。

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; }
}