在List中存储不同(不可修改的)类型

时间:2013-11-15 09:59:33

标签: c# object casting base-class downcast

我正在使用两个不同的库,每个库都有自己的点类型。两种类型都有x和y坐标,而每种类型都有一些特殊字段。我想在List中存储这两种类型(比如PointAPointB)。我不能使用基类,因为PointAPointB是库类型,不能修改。

我必须在List中实际使用List(一组点数组)。我从 Library1 调用的方法返回List<PointA>,而library2的方法返回List<PointB>

在一个List中存储这些点数组的最佳方法是什么?使用List<List<Object>>并将返回数组中的每个对象转换为Object?看起来这样可以更优雅地完成。

2 个答案:

答案 0 :(得分:1)

我只能想到一个可能的解决方案。创建自己的“包装器”类,处理类型统一/转换(未经测试):

class StoredPoint {
    PointA pa;
    PointB pb;

    public StoredPoint (PointA other) {
        pa = other;
        // pb is null
    }

    public StoredPoint (PointB other) {
        pb = other;
        // pa is null
    }

    public static implicit operator StoredPoint(PointA other) {
        return new StoredPoint(other);
    }

    public static implicit operator StoredPoint(PointB other) {
        return new StoredPoint(other);
    }

    public static implicit operator PointA(StoredPoint point) {
        if (pa != null)
            return pa;
        return PointA(0,0); // some default value in case you can't return null
    }

    public static implicit operator PointA(StoredPoint point) {
        if (pa != null)
            return pa;
        return PointA(0,0); // some default value in case you can't return null
    }

    public static implicit operator PointB(StoredPoint point) {
        if (pb != null)
            return pb;
        return PointB(0,0); // some default value in case you can't return null
    }
  }

然后你可以使用List<StoredPoint>创建一个列表,并为它添加两种类型的点。您是否能够使用结果列表是一些不同的问题(主要是由于错误处理等)。

答案 1 :(得分:0)

您可以使用ArrayList库中的非通用System.Collections

但更好的选择可能是您创建自己的点类并将PointAPointB对象转换为它。

例如,假设您定义了自己的类型PointList:

public class PointList : List<MegaPoint>

(其中MegaPoint是您自己对点的定义。)

因此,列表中的每个项目都保证为MegaPoint类型。然后,如果要添加其他类型的列表,请实现以下方法:

public void AddFrom(List<PointA> points)

public void AddFrom(List<PointB> points)

不只是添加项目,而是将它们转换为“通用”MegaPoint

现在您的代码可以根据需要使用这些库,但您的List将始终包含一个类型MegaPoint,其中包含应用程序的正确属性。