Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# IGeoPositionWatcher<;地理位置>;。未激发PositionChanged,但GeoCoordinateWatcher.PositionChanged已激发_C#_.net 4.0 - Fatal编程技术网

C# IGeoPositionWatcher<;地理位置>;。未激发PositionChanged,但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

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

以下是代码的工作版本:

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应用程序中尝试了这些代码,它们的行为都是相同的。我在原来的问题上增加了我的最新发现。