【问题标题】:Cast a variable to a type represented by another Type variable?将变量转换为另一个类型变量表示的类型?
【发布时间】:2009-10-10 18:58:05
【问题描述】:

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

在 VB.net 或 C#(任何一种语言,都无所谓)中,我想将一个变量强制转换为由另一个 Type 变量表示的类型。下面是 C# 中需要的那种代码示例:

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(castMe, Foo) 仍然会抛出 InvalidCastException

【问题讨论】:

    标签: c# vb.net casting


    【解决方案1】:

    如果您确实知道要转换为哪种类型,您最终将不得不得到如下结果:

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

    T 现在是你的类型参数。

    如果您知道要转换的类型是什么,编译器也无法知道。这对你来说是一种静态类型的语言。如果你不喜欢这样的东西,你可能想去逛逛,例如红宝石。

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

    【讨论】:

    • 谢谢;那个通用方法正是我需要的那种东西!查看我对问题的回答以查看我最终编写的函数。
    【解决方案2】:

    由于您最终会将演员分配给“Foo”,因此您可以编写

    Foo beCast = (Foo)castMe;

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

    【讨论】:

      【解决方案3】:

      感谢弗兰克,我已经能够获得我想要工作的功能,工作正常。我最终编写的函数是:

      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"))
      

      显然,您需要在编译时知道要转换为的类型(我知道),但它是一种非常好的速记方式,可以代替为您可能要转换为的每种不同类型编写单独的方法。

      【讨论】:

        猜你喜欢
        • 2016-11-27
        • 1970-01-01
        • 1970-01-01
        • 2017-09-20
        • 2011-07-03
        • 2015-08-16
        • 2020-02-01
        • 2011-01-28
        • 2011-10-31
        相关资源
        最近更新 更多