gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:47:48 26 4
gpt4 key购买 nike

初始情况:

我正在使用一个专有框架( 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();

问题是点和多边形形状(IPointIPolygon)都包裹在同一类型(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 类型的先决条件,静态检查器会给您一个编译时警告。

关于c# - 为类型 T 编写扩展方法;如何为 T 的字段添加类型约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3171130/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com