Я использую библиотеку GeoJSON.NET в своем проекте. В какой-то момент мне нужно обновить функцию в моей базе данных. Как часть этого, мне нужно получить доступ к координатам указанной функции, чтобы сохранить эту информацию в базе данных. Однако, глядя на исходный код на GitHub, класс Feature имеет свойство Geometry как IGeometryObject:Литой интерфейс для конкретного типа
public IGeometryObject Geometry { get; set; }
Там существует несколько «форм» в соответствии со спецификацией GeoJSON, такие как «Полигон», «Круг», «Точка »и т. д. Эти конкретные формы были созданы в рамках проекта GeoJSON.NET.
Именно в этих конкретных типах я могу на самом деле копаться и получать доступ к различным координатам.
В настоящее время у меня есть это:
public int CreateFeature(Feature feature)
{
int featureId = 0;
var coordinatesDt = new DataTable();
coordinatesDt.Columns.Add("Latitude");
coordinatesDt.Columns.Add("Longitude");
//we are loading a datatable with the coordinates. This gets passed to a SQL server stored procedure as a single parameters to insert
//all the nodes.
LineString lineString = ((Polygon)feature.Geometry).Coordinates[0];
foreach (var coordinate in lineString.Coordinates)
{
var row = coordinatesDt.NewRow();
row["Latitude"] = ((GeographicPosition)coordinate).Latitude;
row["Longitude"] = ((GeographicPosition) coordinate).Longitude;
coordinatesDt.Rows.Add(row);
}
using (SqlConnection conn = new SqlConnection(_smmConnectionString))
using (SqlCommand cmd = new SqlCommand("dbo.MyProc", conn))
{
//set up params, set up TVP and execute...
}
return featureId;
}
А вот фрагмент из класса Polygon:
public List<LineString> Coordinates { get; set; }
Так вот в моем коде, я на самом деле делает явный опущенными к Polygon, как Мне нужно добраться до члена Координаты класса Polygon. Я знаю, что я в безопасности, чтобы сделать это только на том основании, что это единственные «типы» форм, которые я использую в своем приложении, хотя я знаю, что это не обязательно лучшая практика. Однако в будущем, если мы будем использовать другие типы, это будет полностью нарушено. Я могу пойти реализовать, используя «is или as» для проверки типов, но это все еще не отвлекает меня от понятия «downcast».
Итак, мой вопрос - это лучший способ сделать это? Я читал о том, почему использовать интерфейсы и все это как члены и/или параметры, и что необходимость делать явное опустошение - это обычно «плохая практика» и следует за плохим шаблоном проектирования ... за исключением редких случаев. Так что я попадаю в «редкие случаи» здесь или есть лучший способ сделать это?
Спасибо за отзыв! Я очень благодарен. Из-за ограничений по времени, а также так мало вариантов для типов фигур, я, вероятно, просто придерживаюсь опции 1. – dvsoukup
Викинг и изменение внешнего api - довольно плохая идея, так как это становится намного сложнее в обслуживании (обновление до новых версии). Если вы поедете по этой дороге, вы действительно можете добавить недостающую функцию, которую вы хотите в интерфейсе: GetGeoPosition() –
Я думаю, что GetGeoPosition() и настройка в каждом конкретном типе были бы ключевым аспектом здесь и помогли бы, не имея чтобы переусердствовать с получением этих координат. Благодаря! – dvsoukup