0

Я пытаюсь написать функцию, которая просто рисует круг на карте. Я в основном следую приведенному коду here. Вот мой фактический код:Нет метода расширения для метода, который я уже явно определил

using attempt2.Common; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Device.Location; 
using System.Windows; 
using Windows.Foundation; 
using Windows.UI.Xaml.Controls.Maps; 
using Windows.Devices.Geolocation; 
using Windows.Services.Maps; 
using Windows.Storage.Streams; 
using Windows.UI.Xaml.Shapes; 
using System.Device.Location; 

namespace attempt2 
{ 
    class MapsClass 
{ 

    //computes a point on the perimeter given an arbitrary point and distance 

    public GeoCoordinate getDistanceBearing(this GeoCoordinate point, double distance, double bearing = 180) 
    { 
     double radius = Convert.ToDouble(this.Set.container.Values["Radius"]); 

     const double degreestoRadian = Math.PI/180; 
     const double radiantoDegrees = 180/Math.PI; 
     const double earthRadius = 6378137.0; 

     var latA = point.Latitude * degreestoRadian; 
     var longA = point.Longitude * degreestoRadian; 
     var angularDistance = distance/earthRadius; 
     var trueCourse = bearing * degreestoRadian; 

     var lat = Math.Asin(Math.Sin(latA) * Math.Cos(angularDistance) + Math.Cos(latA) * Math.Sin(angularDistance) * Math.Cos(trueCourse)); 

     var dlon = Math.Atan2(Math.Sin(trueCourse) * Math.Sin(angularDistance) * Math.Cos(latA), 
      Math.Cos(angularDistance) - Math.Sin(latA) * Math.Sin(lat)); 

     var lon = ((longA + dlon + Math.PI) % (Math.PI * 2)) - Math.PI; 

     var result = new GeoCoordinate(lat * radiantoDegrees, lon * radiantoDegrees); 

     return result; 
    } 

    //adds up a series of those points to create a circle 

    public static IList<GeoCoordinate> GetCirclePoints(this GeoCoordinate center, 
           double radius, int nrOfPoints = 50) 
    { 
     var angle = 360.0/nrOfPoints; 
     var locations = new List<GeoCoordinate>(); 
     for (var i = 0; i <= nrOfPoints; i++) 
     { 
      locations.Add(center.getDistanceBearing(radius, angle * i)); 
     } 
     return locations; 
    } 

    //draws the circle on the map 

    private void MainPageLoaded() 
    { 
     if (this.Data.CurrentOrNot == false)  //searched location 
     { 
      var location = this.Data.SearchedLocation; 
      Map.Center = location; 
      Map.ZoomLevel = 16; 

      var fill = Windows.UI.Color.FromArgb(50, 100, 0, 100); 
      var stroke = Windows.UI.Color.FromArgb(150, 250, 0, 0); 
      fill.A = 80; 
      stroke.A = 80; 
      var circle = new MapPolygon 
      { 
       StrokeThickness = 2, 
       FillColor = fill, 
       StrokeColor = stroke, 
       StrokeDashed = false, 
      }; 

      foreach (var p in location.GetCirclePoints(150)) 
      { 
       circle.Path.Add(p); 
      } 

      Map.MapElements.Add(circle); 


     } else 
     { 
      var location = this.Data.CurrentLocation; 
      Map.Center = location; 
      Map.ZoomLevel = 16; 

      var fill = Windows.UI.Color.FromArgb(50, 100, 0, 100); 
      var stroke = Windows.UI.Color.FromArgb(150, 250, 0, 0); 
      fill.A = 80; 
      stroke.A = 80; 
      var circle = new MapPolygon 
      { 
       StrokeThickness = 2, 
       FillColor = fill, 
       StrokeColor = stroke, 
       StrokeDashed = false, 
      }; 

      foreach (var p in location.GetCirclePoints(150)) 
      { 
       circle.Path.Add(p); 
      } 

      Map.MapElements.Add(circle); 

     }   

    } 

Единственные ошибки я получаю в линии, когда я звоню один из методов, так конкретно линия locations.Add(center.getDistanceBearing(radius, angle * i));, и оба экземпляра foreach (var p in location.GetCirclePoints(150)). Visual Studio дает мне ошибку

«System.Device.Location.GeoCoordinate» не содержит определение для «getDistanceBearing» и без метода расширения «getDistanceBearing» принимать первый аргумент типа «System.Device.Location .GeoCoordinate '(вы не указали ссылку на использование или ссылку на сборку?)

и ошибка того же типа, когда я ссылаюсь на GetCirclePoints. Но почему это дает мне эти ошибки, когда у меня уже определены методы? И почему в этом примере, по-видимому, работает тот же код?

ответ

0

методы расширения должны быть static методы в static классе

MapsClass и getDistanceBearing не являются статичными

вы можете использовать свои методы, как общие методы

0

Вы не следующие правила для методов расширения. Эти классы и методы также должны быть помечены как статические. Простого пример:

public static class Extension 
{ 
    const string _DefaultBasePath = @"C:\Users\stuyckp\Documents\Visual Studio 2013\Projects\WPF\Interstone"; 
    private static string _BasePath = null; 
    public static string getFullPath(this string relativePath) 
    { 
     if (relativePath == null) return null; 
     string path = BasePath; 
     if (!path.EndsWith("\\") && !relativePath.StartsWith("\\")) path += "\\"; 
     return path + relativePath; 
    } 

    static private string BasePath 
    { 
     get 
     { 
      if (_BasePath != null) return _BasePath; 

      try 
      { 
       Configuration cs = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
       ConfigurationSectionGroup g = cs.SectionGroups["applicationSettings"]; 
       ClientSettingsSection s 
        = (from ConfigurationSection section in g.Sections 
         where section is ClientSettingsSection 
         select section).FirstOrDefault() as ClientSettingsSection; 
       _BasePath = s.Settings.Get("BasePath").Value.ValueXml.InnerText; 
      } 
      catch 
      { 
       _BasePath = _DefaultBasePath; 
      } 

      return _BasePath; 
     } 
    } 
} 

Ничего не комбинировать, только использовать эти статические классы для кода, необходимый для самого метода расширения. Это фактически делает почти все в классе как статический: частный переменных, вспомогательные методы, ...

так что вам нужно что-то вроде этого:

public static class MapsClass{ 
//computes a point on the perimeter given an arbitrary point and distance 

public static GeoCoordinate getDistanceBearing(this GeoCoordinate point, double distance, double bearing = 180) 
{ 
    double radius = Convert.ToDouble(this.Set.container.Values["Radius"]); 

    const double degreestoRadian = Math.PI/180; 
    const double radiantoDegrees = 180/Math.PI; 
    const double earthRadius = 6378137.0; 

    var latA = point.Latitude * degreestoRadian; 
    var longA = point.Longitude * degreestoRadian; 
    var angularDistance = distance/earthRadius; 
    var trueCourse = bearing * degreestoRadian; 

    var lat = Math.Asin(Math.Sin(latA) * Math.Cos(angularDistance) + Math.Cos(latA) * Math.Sin(angularDistance) * Math.Cos(trueCourse)); 

    var dlon = Math.Atan2(Math.Sin(trueCourse) * Math.Sin(angularDistance) * Math.Cos(latA), 
     Math.Cos(angularDistance) - Math.Sin(latA) * Math.Sin(lat)); 

    var lon = ((longA + dlon + Math.PI) % (Math.PI * 2)) - Math.PI; 

    var result = new GeoCoordinate(lat * radiantoDegrees, lon * radiantoDegrees); 

    return result; 
} 

//adds up a series of those points to create a circle 

public static IList<GeoCoordinate> GetCirclePoints(this GeoCoordinate center, 
          double radius, int nrOfPoints = 50) 
{ 
    var angle = 360.0/nrOfPoints; 
    var locations = new List<GeoCoordinate>(); 
    for (var i = 0; i <= nrOfPoints; i++) 
    { 
     locations.Add(center.getDistanceBearing(radius, angle * i)); 
    } 
    return locations; 
} 
Смежные вопросы