知道抽象类的Child类型

时间:2011-06-02 18:42:24

标签: c# oop

在实体框架中使用Table per Hierarchy设置时,我遇到了设计服务层的问题。我的问题是我得到一个特定类型的对象,但我想检查类型是什么。这在代码中有更好的解释:

抽象域类

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

所以你基本上可以这样做:

orderRepository.GetOrders();
//OR
orderRepository.GetOrders().OfType<OrderProduct>();
//OR
orderRepository.GetOrders().OfType<OrderSubscription>();

我基本上使用的是第一个。它返回IQueryable<Order>

我想制作一个服务层方法来进行任何类型的调用,例如:

public Order GetOrder(string orderId)
{
    return orderRepository.GetOrders().FirstOrDefault(o => o.OrderId == orderId);
}

问题

在我的控制器中,如何在调用GetOrder(string orderId)后判断对象的类型?如果它是OrderProduct类型,那么当我投射它时,我还需要导航属性(List<OrderDetail>)。

我看到的一个解决方案是为每个Order类进行两种类型的服务层调用。调用1,如果返回null,则调用另一个。但是在C#中有没有OOP方法呢?

2 个答案:

答案 0 :(得分:2)

我不完全确定你在问什么,但我认为你正在寻找is运营商:

Order order = //...    
bool isSubscription = order is OrderSubscription;

此外,如果您想在之后使用该值,您也可以使用as,这会将其强制转换或返回null它不属于该类型。

Order order = //...
OrderSubscription subscription = order as OrderSubscription;
if (subscription != null)
{
  // use subscription
}

答案 1 :(得分:0)

Order o = GetOrder("12345");
if (o is OrderProduct)
{
    var product = (OrderProduct)o;
}
else if (o is OrderSubscription)
{
    var subscription = (OrderSubscription)o;
}

这可以满足您的需求吗?我对你的需求有点模糊。