Исходная ситуация:
Я работаю с проприетарной платформой ( ESRI ArcGIS Engine ), которую я хочу расширитьнекоторые новые функции.Для этого я решил использовать методы расширения в C #.
Ниже показаны части API среды, которые относятся к этому вопросу:
+------------------------+ IGeometry
| IFeature <interface> | <interface>
+------------------------+ ^
| +Shape: IGeometry | |
+------------------------+ +---------+---------+
| |
IPoint IPolygon
<interface> <interface>
Что я хочу сделать:
Я хочу написать метод расширения для IFeature
, который позволит следующее:
IFeature featureWithPointShape = ...,
featureWithPolygonShape = ...;
// this should work:
featureWithPointShape.DoSomethingWithPointFeature();
// this would ideally raise a compile-time error:
featureWithPolygonShape.DoSomethingWithPointFeature();
Проблема заключается в том, что как точечные, так и многоугольные формы(IPoint
и IPolygon
) упакованы в один и тот же тип (IFeature
), для которого определен метод расширения.Метод расширения должен быть на IFeature
, потому что я могу получить только от IFeature
к его IGeometry
, но не наоборот.
Вопрос:
В то время как тип IFeature
объекта Shape
можно легко проверить во время выполнения (см. Пример кода ниже), как я могу выполнить эту проверку типа во время компиляции?
public static void DoSomethingWithPointFeature(this IFeature feature)
{
if (!(feature.Shape is IPoint))
{
throw new NotSupportedException("Method accepts only point features!");
}
... // (do something useful here)
}
(Есть ли какой-нибудь способ использовать универсальный тип оболочки для IFeature
, например, FeatureWithShape<IPoint>
, определить метод расширения для этого типа оболочки, а затем каким-то образом превратить все объекты IFeature
в этот тип оболочки?)