C# 了解抽象类的子类型
在实体框架中使用每个层次的C# 了解抽象类的子类型,c#,oop,C#,Oop,在实体框架中使用每个层次的表时,我在设计服务层时遇到问题。我的问题是,我得到的是一个特定类型的对象,但我想检查类型是什么。这在代码中有更好的解释: 抽象域类 public abstract class Order { public string OrderId { get; set; } } public class OrderProduct : Order { public List<OrderDetail> OrderDetails { get; set; }
表时,我在设计服务层时遇到问题。我的问题是,我得到的是一个特定类型的对象,但我想检查类型是什么。这在代码中有更好的解释:
抽象域类
public abstract class Order
{
public string OrderId { get; set; }
}
public class OrderProduct : Order
{
public List<OrderDetail> OrderDetails { get; set; }
}
public class OrderSubscription : Order
{
public decimal Fee { get; set; }
public DateTime? EndDate { get; set; }
}
继承的类
public abstract class Order
{
public string OrderId { get; set; }
}
public class OrderProduct : Order
{
public List<OrderDetail> OrderDetails { get; set; }
}
public class OrderSubscription : Order
{
public decimal Fee { get; set; }
public DateTime? EndDate { get; set; }
}
问题
在我的控制器中,在调用GetOrder(stringorderid)
之后,如何判断对象的类型?如果它的类型是OrderProduct
,那么我还需要导航属性(List
)在我转换它时出现在那里
我看到的一个解决方案是为每个订单
类调用两种类型的服务层。调用1,如果它返回null,则调用另一个。但是有没有一种面向对象的方法可以在C#中实现这一点
这能满足你的需要吗?我对您的需求有点模糊。我不完全确定您的要求,但我认为您正在寻找is
操作员:
Order order = //...
bool isSubscription = order is OrderSubscription;
此外,如果要在之后使用该值,也可以将用作
,这将强制转换它或返回null
它不是该类型
Order order = //...
OrderSubscription subscription = order as OrderSubscription;
if (subscription != null)
{
// use subscription
}
在我脑海中,只需在抽象类和继承类中添加一个类型属性即可。或者类似的东西。所以即使我返回了Order
,它仍然可以是OrderSubscription
类型,并且我可以使用基类之外的所有属性强制转换它?是的。OrderSubscription
也是一个Order
,而Order
也可能是OrderSubscription
。强制转换不会更改对象的实际类型。Cast实际上只是告诉编译器这个变量应该是类型顺序的,但是真正的对象是未触及的
Order order = //...
OrderSubscription subscription = order as OrderSubscription;
if (subscription != null)
{
// use subscription
}