因此,当涉及诸如属性之类的数据时,我们有Order
就是逻辑,而IOrderData
则连接了视图和逻辑。 Order
具有枚举PayMethod
和OrderStatus
的属性。如何在接口层不了解逻辑和视图的情况下在PayMethod
中创建OrderStatus
和IOrderData
的属性?
示例:
项目逻辑:
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
创建了一个新的类库,其中包含PayMethod
和OrderStatus
类,在我们使用枚举的所有地方,我都引用了类库。 >
答案 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; }
}