c# - 了解抽象类的子类型

标签 c# oop

我在使用 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/

相关文章:

oop - 将指向私有(private)数据的指针发送给另一个类是一种良好的面向对象设计实践吗?

c# - Form1 的类型初始值设定项抛出异常

c# - 如何在 C# AspNet Core 中模拟 LoggerFactory

c# - 预期异常时应用 Arrange-Act-Assert 模式的最佳方法

c# - 多种类型的扩展方法

ruby - 如何访问ruby中的幽灵父类?

Javascript - 反射(reflect)封装的成员

PHP 依赖注入(inject) - fatal error

php - 为什么在构造函数的站点外的类中声明变量?

c# - 从 asp.net c# 中的服务器错误接收结果时发生传输级错误