我在使用 Table per Hierarchy
时设计服务层时遇到问题使用 Entity Framework 设置。我的问题是我得到了一个特定类型的对象,但我想检查该类型是什么。这在代码中有更好的解释:
抽象域类
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>
我想创建 1 个服务层方法来调用获取任何类型,例如:
public Order GetOrder(string orderId)
{
return orderRepository.GetOrders().FirstOrDefault(o => o.OrderId == orderId);
}
问题
在我的 Controller 中,我如何在调用 GetOrder(string orderId)
后判断对象的类型? ?如果是 OrderProduct
类型, 然后我还需要导航属性 ( List<OrderDetail>
) 在我转换时存在。
我看到的一个解决方案是为每个 Order
调用两种类型的服务层调用类(class)。调用1,如果返回null,则调用另一个。但是在 C# 中是否有 OOP 方法来执行此操作?
最佳答案
我不完全确定你在问什么,但我认为你正在寻找 is
运算符:
Order order = //...
bool isSubscription = order is OrderSubscription;
此外,如果你想使用之后的值,你也可以使用 as
,这将转换它或返回 null
它不是类型。
Order order = //...
OrderSubscription subscription = order as OrderSubscription;
if (subscription != null)
{
// use subscription
}
关于c# - 了解抽象类的子类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6218874/