编程语言
首页 > 编程语言> > c#-为类型T编写扩展方法;如何为T字段添加类型约束?

c#-为类型T编写扩展方法;如何为T字段添加类型约束?

作者:互联网

初始情况:

我正在使用专有框架(ESRIArcGIS 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&gt ;,为此包装类型定义扩展方法,然后以某种方式将所有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