【发布时间】:2018-01-15 14:54:02
【问题描述】:
我想创建一个函数,该函数接受一个 Position 对象并将该 Position 的纬度和经度作为格式化字符串返回。
但问题是我有 2 个 Position 对象:一个来自 Xamarin Forms,另一个来自地理位置块。
来自 Xamarin 表单的位置:
public Position(double latitude, double longitude);
public double Latitude { get; }
public double Longitude { get; }
...
以及来自地理定位块的位置:
public Position();
public Position(Position position);
public double Latitude { get; set; }
public double Longitude { get; set; }
...
为了让这两种类型合二为一,我制作了一个界面:
interface IPosition
{
double Latitude
{
get;
set;
}
double Longitude
{
get;
set;
}
}
所以我的函数应该接受参数中的这两个对象,如下所示:
public static string PositionToCoordonates<T>(T p)
{
return ((IPosition)p).Latitude.ToString().Replace(",", ".") + " ," + ((IPosition)p).Longitude.ToString().Replace(",", ".");
}
不幸的是,它在运行时抛出错误“System.InvalidCastException: Specified cast is not valid.”。
我做错了什么?我想我需要某种动态演员表,但我不确定。
【问题讨论】:
-
你怎么打电话给
PositionToCoordinates()。考虑在 T 上添加一个约束,例如PositionToCoordonates<T>(T p) where T : IPosition。 -
我明白创建
IPosition背后的原因是如何实现的。我觉得你可能会混淆如何使用它。约束可能是我们的解决方案,但您需要阐明您打算如何使用该方法 -
@LordWilmore 谢谢你的回答。我这样称呼它:GpsDistanceHelper.PositionToCoordonates(currentPosition);所以我应该这样试试? : GpsDistanceHelper.PositionToCoordonates
(currentPosition) 其中 T : IPosition; ? -
@Doctor 首先,该方法没有理由是通用的。你没有得到任何东西是通用的,然后受到限制。只是一开始就不要让它泛化。
-
@LordWilmore 这没有任何意义,如果它只能是一种类型而不是参数属于该类型。这里对泛型的需求为零
标签: c# templates interface casting xamarin.forms