Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 了解抽象类的子类型_C#_Oop - Fatal编程技术网

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
}