c#-为类型T编写扩展方法;如何为T字段添加类型约束?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c#-为类型T编写扩展方法;如何为T字段添加类型约束?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1850字,纯文字阅读大概需要3分钟。
内容图文
![c#-为类型T编写扩展方法;如何为T字段添加类型约束?](/upload/InfoBanner/zyjiaocheng/671/65e0896003814762bc0bc704ce3aa13f.jpg)
初始情况:
我正在使用专有框架(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的类型有先决条件,则静态检查器将向您发出编译时警告.
内容总结
以上是互联网集市为您收集整理的c#-为类型T编写扩展方法;如何为T字段添加类型约束?全部内容,希望文章能够帮你解决c#-为类型T编写扩展方法;如何为T字段添加类型约束?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。