c#-为类型T编写扩展方法;如何为T字段添加类型约束?
作者:互联网
初始情况:
我正在使用专有框架(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对象转换为该包装类型?)
解决方法:
根据定义,如果您具有IFeature对象,则其Shape属性可以包含实现IGeometry的任何类型的值.如果您控制IFeature对象的实例化,则可以创建自己的实现IFeature的通用类,或者从实现IFeature的框架类派生一个类,然后可以轻松地限制Shape的类型.如果您无法控制这些对象的实例化,则可能会遇到运行时检查的问题.
如果碰巧使用的是.NET 4.0,则可以使用代码契约.如果扩展方法对Shape的类型有先决条件,则静态检查器将向您发出编译时警告.
标签:extension-methods,type-constraints,typechecking,c,arcobjects 来源: https://codeday.me/bug/20191106/1999118.html