我们知道不可能将父对象强制转换为其子类之一。
那么解决以下问题的好方法是什么: 假设我有一个父类“Person”和两个子类:Customer 和 Employee。请注意,Person 类不是抽象的(这意味着它可以被实例化)。 现在我得到了以下方法签名:
public Person GetPersonById(long id)
这使得返回一个 Person 或其子类之一成为可能。 如果我使用这种方法,我可以通过 GetType() 检查它是否是一个 child 。但是,我不能轻易访问特定于子类的字段/方法,因为我不能只转换它。 一种方法是为每个子类实现一个构造函数,该构造函数将父类作为参数并返回一个新的子类实例。这样做的缺点是我仍然会有很多重复代码(因为我还必须在每个子项中分配每个父字段)。
我能想到的另一种方法是将方法更改为:
public object GetPersonById(long id)
那样的话,我可以返回任何类。我只是检查返回类的类型,然后正确地转换它。但不知何故,这种方法似乎很肮脏。
有没有人有更好的方法来做到这一点?
最佳答案
你可以将 Person
转换为 Customer
如果它确实是一个 Customer
:
var customer = person as Customer;
if(customer != null)
{
// the person was really a Customer
}
如果您愿意,可以创建三个方法而不是一个:
public Person GetPersonById(long id)
public Customer GetCustomerById(long id)
public Employee GetEmployeeById(long id)
或者使用泛型(但在那种特殊情况下我对泛型感觉很糟糕):
public T GetPersonById<T>(long id) where T : Person
并称它为:
var person = GetPersonById<Employee>(123);
但是您仍然需要在通话时指定您想要获得的内容。
关于C# 继承 : casting of parent object to child,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15951411/