gpt4 book ai didi

c# - IGeoPositionWatcher.PositionChanged 没有被解雇,但是 GeoCoordinateWatcher.PositionChanged 是

转载 作者:行者123 更新时间:2023-11-30 18:07:31 26 4
gpt4 key购买 nike

我正在尝试编写一个应用程序,它使用 .net 4.0 System.Device.Location 命名空间监视计算机的位置。但是,我发现 GeoCoordinateWatcher.PositionChanged 事件仅在我在类上注册事件时触发,而不是在我使用它实现的接口(interface)时触发。

这是代码的工作版本:

using (GeoCoordinateWatcher geoCoordinateWatcher = new GeoCoordinateWatcher())
{
geoCoordinateWatcher.PositionChanged += (sender, args) => Console.WriteLine(args.Position);
geoCoordinateWatcher.Start();

Thread.Sleep(2000);
}

这会按我的预期输出位置对象。当我将代码更改为:

using (GeoCoordinateWatcher geoCoordinateWatcher = new GeoCoordinateWatcher())
{
IGeoPositionWatcher<GeoCoordinate> positionWatcher = geoCoordinateWatcher;
positionWatcher.PositionChanged += (sender, args) => Console.WriteLine(args.Position);
positionWatcher.Start();

Thread.Sleep(2000);
}

它不输出任何东西。我想使用该接口(interface),以便更轻松地对代码进行单元测试。

我做错了什么?我对通用接口(interface)上的事件有什么微妙的误解吗?

谢谢

安迪

编辑:

我认为这可能是微软代码中的一个错误。我查看了 .net 反射器中的 System.Device.dll,发现 GeoCoordinateWatcher 有 2 个 PositionChanged 事件的实现。第一个是它自己的 PositionChanged 事件的直接实现,第二个是 IGeoPositionWatcher.PositionChanged 事件的显式实现。

第二个似乎没有在代码中的其他任何地方使用。

我还设法通过从 GeoCoordinateWatcher 派生并自己实现接口(interface) PositionChanged 事件找到了一个快速的解决方法:

public class MyGeoCoordinateWatcher : GeoCoordinateWatcher, IGeoPositionWatcher<GeoCoordinate>
{
event EventHandler<GeoPositionChangedEventArgs<GeoCoordinate>> IGeoPositionWatcher<GeoCoordinate>.PositionChanged
{
add { base.PositionChanged += value; }
remove { base.PositionChanged -= value; }
}
}

现在,如果我创建一个 MyGeoCoordinateWatcher 而不是上述两组代码。

谁能证实这一点?

谢谢

编辑:

在 Microsoft Connect 上提出此问题:https://connect.microsoft.com/VisualStudio/feedback/details/613235/igeopositionwatcher-geocoordinate-positionchanged-event-does-not-fire-on-geocoordinatewatcher-class

最佳答案

我完全同意你的诊断,很好的侦查。显式接口(interface)实现正在更新名为 m_positionChanged 的​​字段。 PositionChanged 事件正在更新名为 PositionChanged 的​​委托(delegate)字段。

看到大男孩们摸索这个很鼓舞人心。除了黑客反射直接访问私有(private)字段之外,没有简单的解决方法。您可以在 connect.microsoft.com 报告错误。只需一个指向该线程的链接就可以为他们提供所需的一切。

关于c# - IGeoPositionWatcher<GeoPosition>.PositionChanged 没有被解雇,但是 GeoCoordinateWatcher.PositionChanged 是,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3922742/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com