C# IGeoPositionWatcher<;地理位置>;。未激发PositionChanged,但GeoCoordinateWatcher.PositionChanged已激发
我正在尝试编写一个应用程序,它使用.net 4.0 System.Device.location命名空间监视计算机的位置。但是,我发现GeoCoordinateWatcher.PositionChanged事件仅在我向类上的事件注册时触发,而不是在我使用它实现的接口时触发 以下是代码的工作版本:C# IGeoPositionWatcher<;地理位置>;。未激发PositionChanged,但GeoCoordinateWatcher.PositionChanged已激发,c#,.net-4.0,C#,.net 4.0,我正在尝试编写一个应用程序,它使用.net 4.0 System.Device.location命名空间监视计算机的位置。但是,我发现GeoCoordinateWatcher.PositionChanged事件仅在我向类上的事件注册时触发,而不是在我使用它实现的接口时触发 以下是代码的工作版本: using (GeoCoordinateWatcher geoCoordinateWatcher = new GeoCoordinateWatcher()) { geoCoordinateWat
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);
}
使用(GeoCoordinateWatcher GeoCoordinateWatcher=new GeoCoordinateWatcher())
{
IGeoPositionWatcher定位器Watcher=地理坐标追踪器;
positionWatcher.PositionChanged+=(发送器,参数)=>Console.WriteLine(参数位置);
positionWatcher.Start();
《睡眠》(2000年);
}
它不输出任何东西。我想使用接口,以便更容易对代码进行单元测试
我做错了什么?我对通用接口上的事件是否有一些微妙的误解
谢谢
安迪
编辑:
我认为这可能是微软代码中的一个错误。我查看了.net reflector中的System.Device.dll,发现GeoCoordinateWatcher有两个PositionChanged事件的实现。第一个是它自己的PositionChanged事件的直接实现,第二个是IGeoPositionWatcher.PositionChanged事件的显式实现
第二个似乎不在代码中的任何其他地方使用
我还通过从GeoCoordinateWatcher派生并自己实现接口PositionChanged事件,找到了一个快速的解决方法:
public class MyGeoCoordinateWatcher : GeoCoordinateWatcher, IGeoPositionWatcher<GeoCoordinate>
{
event EventHandler<GeoPositionChangedEventArgs<GeoCoordinate>> IGeoPositionWatcher<GeoCoordinate>.PositionChanged
{
add { base.PositionChanged += value; }
remove { base.PositionChanged -= value; }
}
}
公共类MyGeoCoordinateWatcher:GeoCoordinateWatcher,IGeoPositionWatcher
{
事件事件处理程序IGeoPositionWatcher.PositionChanged
{
添加{base.PositionChanged+=value;}
删除{base.PositionChanged-=value;}
}
}
现在,如果我创建一个MyGeoCoordinateWatcher,则上述两组代码都可以工作
有人能证实这一点吗
谢谢
编辑:
在Microsoft Connect上提出此问题:我完全同意您的诊断,很好的侦查。显式接口实现正在更新名为m_positionChanged的字段。PositionChanged事件正在更新名为PositionChanged的委托字段
看到大男孩们在这件事上笨手笨脚的,真是令人鼓舞。除了直接访问私有字段之外,没有简单的解决方法。您可以在connect.microsoft.com上报告此错误。只要链接到该线程,就可以满足他们的所有需求。显然,这种行为是有意为之。我已经要求微软澄清这一点,因为在我看来这是一个非常奇怪的设计。界面事件的实现看起来如何?显性还是隐性?另一个是作为接口一部分的
Start
方法。从这里的元数据中提取相关部分:公共接口IGeoPositionWatcher{…EventHandler PositionChanged;void Start();}公共类GeoCoordinateWatcher:IDisposable,INotifyPropertyChanged,IGeoPositionWatcher{…public event EventHandler PositionChanged;public void Start();}我在单元测试、控制台应用程序和WPF应用程序中尝试了这些代码,它们的行为都是相同的。我在原来的问题上增加了我的最新发现。