我有一些类和接口协方差在通用集合C#
public interface IGeoObject
{
GeoCoordinate GetGeocoordinate();
}
public class User : IGeoObject
{
public GeoCoordinate GetGeocoordinate()
{
//...
return GeoCoordinate;
}
}
public class Venue : IGeoObject
{
public GeoCoordinate GetGeocoordinate()
{
//...
return GeoCoordinate;
}
}
public class Place : IGeoObject
{
public GeoCoordinate GetGeocoordinate()
{
//...
return GeoCoordinate;
}
}
我有,例如可变用户类型List<User>
我有方法与签名
double GetMinDistance(List<IGeoObject> objects, GeoCoordinate position)
我可以不会将用户传递给GetMinDistance
,因为泛型类型的协变不起作用。
我可以创建其他列表和使用方法.ConvertAll
(或.CasT<T>
):
List<IGeoObject> list = new List<User>(listUser).ConvertAll(x => (IGeoObject)x);
var dist = GeoTest.GetMinDistance(list, position);
我不知道,这是最完美的解决方案。最让人尴尬的是来电者必须做这个转换。
这与我在架构中遇到的问题类似吗?有更多优雅的解决方案?
P.S.长话短说,但我实在无法给出所有类别中同一物种的坐标。
在其他更糟的是,如果他改变了方法签名为'双GetMinDistance(IEnumerable的对象,会有地理座标位置)'然后他可以通过'名单'。 –
谢谢你,很好的回答! – Alexandr