接口之间的转换


来源

接口之间的转换

在 C# 中进行转换

在 C# 中,在接口之间进行强制转换的最佳方法是使用 as 运算符。 使用 as 运算符是比直接强制转换更好的编码策略,因为它在转换失败时产生 null 而不是引发异常。

以下代码示例中,第一行是直接转换。 如果您确定所讨论的对象实现了这两个接口,这是一种可接受的做法。 如果对象未实现您尝试获取句柄的接口,.NET 将引发异常。 使用更安全的方式,是 as 运算符,如果对象无法返回【对所需接口的引用】,则返回 null。

[C#]

IGeometry geometry=(IGeometry)point; // Straight cast.
IGeometry geometry=point as IGeometry; // As operator.

以下代码示例显示了,如何在显式强制转换后,管理返回空接口句柄的可能性:

[C#]

IPoint point=new PointClass();
IGeometry geometry=point as IGeometry;
if (geometry != null)
{
    Console.WriteLine(geometry.GeometryType.ToString());
}

或者,您可以在执行直接转换之前,使用 is 关键字,测试对象在运行时是否实现了某个接口。 请参见以下代码示例:

[C#]

IPoint point=new PointClass();
if (point is IGeometry)
{
    IGeometry geometry=(IGeometry)point;
    Console.WriteLine(geometry.GeometryType.ToString());
}

在 VB .NET 中进行转换

以下是类型转换的2种方式:

  • 隐式(Implicit) - 不需要额外的语法。
  • 显式(Explicit) - 需要强制转换运算符。

请参见以下代码示例:

[VB.NET]

'Implicit cast.
geometry=point

'Explicit cast.
geometry=CType(point, IGeometry)
geometry=DirectCast(point, IGeometry)
geometry=TryCast(point, IGeometry)

在接口之间进行转换时,使用隐式转换是可以接受的,因为在数字类型之间进行转换时,不会丢失数据。 但是,当强制转换失败时,会引发异常 (System.InvalidCastException)。 为避免处理不必要的异常,最好事先测试对象是否实现了这两个接口。 您可以使用 TypeOf 关键字对此进行测试,该关键字是一个【比较子句】,用于测试对象是否派生自或实现特定类型、接口。

以下代码示例,执行了从 IPoint 到 IGeometry 的隐式转换,仅当在运行时才确定 Point 类实现了 IGeometry 时:

[VB.NET]

Dim point As New PointClass
Dim geometry As IGeometry
If TypeOf point Is IGeometry Then
    geometry=point
End If

如果您更喜欢使用 Option Strict On 语句来限制隐式转换,请使用 CType 或 DirectCast 函数进行显式强制转换。 以下代码示例,对上一个代码示例进行了显式转换:

[VB.NET]

Dim point As New PointClass
Dim geometry As IGeometry
If TypeOf point Is IGeometry Then
    geometry=CType(point, IGeometry)
End If

或者,您可以跳过 TypeOf 比较,并使用 TryCast,它在转换失败时,返回 Nothing。 请参见以下代码示例:

[VB.NET]

Dim point As New PointClass
Dim geometry As IGeometry=TryCast(point, IGeometry)
If geometry IsNot Nothing Then
    Console.WriteLine(geometry.GeometryType.ToString())
End If