c# - 在尝试访问子类成员时使用泛型

标签 c# .net generics

我有这些对象:

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/

相关文章:

c# - SQL 数据读取器返回错误日期

c# - 字节(1024)到字符串转换(1 KB)?

c# - C# 中的纸牌洗牌

java通用模板错误

Haskell/GHC 泛型文档示例缺少类型类约束?

java - 泛型和访问者模式

C# 内联条件字符串 [] 数组

C#接口(interface)问题

c# - C# 中的解析器。如何从字符串填充类

c# - 在 EPPlus 4.5.3 中阅读形状和文本框