初始情况:
我正在使用一个专有框架(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
对象转换为此包装器类型?)