我正在使用两个不同的库,每个库都有自己的点类型。两种类型都有x和y坐标,而每种类型都有一些特殊字段。我想在List中存储这两种类型(比如PointA
和PointB
)。我不能使用基类,因为PointA
和PointB
是库类型,不能修改。
我必须在List中实际使用List(一组点数组)。我从 Library1 调用的方法返回List<PointA>
,而library2的方法返回List<PointB>
。
在一个List中存储这些点数组的最佳方法是什么?使用List<List<Object>>
并将返回数组中的每个对象转换为Object?看起来这样可以更优雅地完成。
答案 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
。
但更好的选择可能是您创建自己的点类并将PointA
和PointB
对象转换为它。
例如,假设您定义了自己的类型PointList:
public class PointList : List<MegaPoint>
(其中MegaPoint
是您自己对点的定义。)
因此,列表中的每个项目都保证为MegaPoint
类型。然后,如果要添加其他类型的列表,请实现以下方法:
public void AddFrom(List<PointA> points)
和
public void AddFrom(List<PointB> points)
不只是添加项目,而是将它们转换为“通用”MegaPoint
。
现在您的代码可以根据需要使用这些库,但您的List将始终包含一个类型MegaPoint
,其中包含应用程序的正确属性。