我有这些对象:
class Order { ... }
class OrderA : Order { public double X; }
class OrderB : Order { public double X; }
class OrderC : Order { public double Y; }
我想做一个方法来接收 Order 对象的 3 个子类中的任何一个,如下所示:
private DoSomething<T>(T order) where T : Order
{
double myValue = order is OrderA || order is OrderB ? (T)order.X : (T)order.Y;
// DO SOMETHING MORE
}
但我无法编译我的代码,因为“T 不包含 X 的定义......” 这可能吗?
最佳答案
这会起作用:
double myValue =
(order is OrderA) ? ((OrderA)order).X :
(order is OrderB) ? ((OrderB)order).X :
(order is OrderC) ? ((OrderC)order).Y;
但是,必须在泛型中进行这种测试,有点违背了使用泛型的目的。
您可以提供不同的 DoSomething
重载来处理您希望收到的每种情况:
private DoSomething(OrderA order)
{
double myValue = order.X;
// DO SOMETHING MORE
}
private DoSomething(OrderB order)
{
double myValue = order.X;
// DO SOMETHING MORE
}
private DoSomething(OrderC order)
{
double myValue = order.Y;
// DO SOMETHING MORE
}
然后您可能希望将“做更多的事情”包装在一个私有(private)方法中,以尽可能多地使用通用逻辑。
或者,您可以在Order
中创建虚拟或抽象方法,如下所示:
class Order {
public virtual double GetValue() { ... }
}
class OrderA : Order {
public double X;
public override double GetValue() { return this.X; }
}
class OrderB : Order {
public double X;
public override double GetValue() { return this.X; }
}
class OrderC : Order {
public double Y;
public override double GetValue() { return this.Y; }
}
...
private DoSomething(Order order)
{
double myValue = order.GetValue();
// DO SOMETHING MORE
}
请注意,这两种解决方案都不需要使用泛型。
关于c# - 在尝试访问子类成员时使用泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22462340/