代码之家  ›  专栏  ›  技术社区  ›  Jez

将一个变量强制转换为另一个类型变量表示的类型?

  •  0
  • Jez  · 技术社区  · 15 年前

    我知道以前有人问过类似的问题,我怀疑这是可能的,但我只是想100%确定这不是。

    Object castMe = new Foo();
    Type castTo = typeof(Foo);
    Foo beenCast = (castTo.GetRepresentedType())castMe;
    beenCast.MethodInFoo();
    

    ... 或者在VB中,类似于:

    Dim castMe As Object = New Foo()
    Dim castTo As Type = GetType(Foo)
    Dim beenCast As Foo = CType(castMe, castTo.GetRepresentedType())
    beenCast.MethodInFoo()
    

    CType(castMe, Foo) ). 我不太明白你为什么不能这么做,尽管。。。当然,可能会导致运行时强制转换错误,但在指定编译时类型时也可以获得这些错误。如果castMe不是Foo的一个实例,那么 CType(卡斯特梅,富) 仍将抛出一个 InvalidCastException

    3 回复  |  直到 15 年前
        1
  •  4
  •   flq    15 年前

    如果你 知道你想选哪一种类型,你将不得不以这样的方式结束:

    public static T Cast<T>(object o) {
      return (T)o;
    }
    

    T现在是您的类型参数。

    如果你 不要

    在这种情况下,通常的响应是通过基类或接口执行的操作—将常见行为提取到可以在静态类型语言中使用的属性、事件和方法中,即使您不知道给定情况下的特定类型。

        2
  •  1
  •   logicnp    15 年前

    因为您最终将把演员表分配给“Foo”,所以您只需编写

    Foo beenCast=(Foo)castMe;

    如果“castMe”是除“Foo”(或派生的)以外的任何其他类型,则强制转换无论如何都会失败,无论您尝试将其强制转换为什么类型都是重要的。

        3
  •  0
  •   Jez    15 年前

    多亏了弗兰克,我才能够得到我想要的功能,工作。我最后写的功能是:

    Public Shared Function CastTypeOrNull(Of T)(ByVal castMe As Object) As T
        If (castMe Is Nothing Or castMe.GetType Is GetType(System.DBNull)) Then
            Return Nothing
        Else
            Return CType(castMe, T)
        End If
    End Function
    

    varDateNullable = CastTypeOrNull(Of Nullable(Of Date))(row("DateTimeValue"))