繁体   English   中英

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

[英]Cast a variable to a type represented by another Type variable?

我知道以前曾问过这样的问题,我怀疑是否有可能,但我只是想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)类型参数返回Type,而不是实际的编译时类型(即CType(castMe, Foo) )。 我不太明白为什么不能这样做,但是...肯定会导致运行时强制转换错误,但是当您指定编译时类型时也可以得到它们。 如果castMe不是Foo的实例,那么即使CType(castMe, Foo)仍将抛出InvalidCastException

如果您确实知道要转换为哪种类型,则必须以如下形式结束:

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

T现在是您的类型参数。

如果您知道要转换为什么类型,则编译器也不知道。 这是适合您的静态类型语言。 如果您不喜欢这样的东西,您可能想要在例如红宝石中徘徊。

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

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

Foo beCast =(Foo)castMe;

如果“ castMe”不是“ Foo”(或派生的)以外的任何其他类型,则强制转换将始终失败,这与您尝试将其强制转换为何种类型无关。

多亏了弗兰克(Frank),我才能够获得想要工作的功能。 我最终编写的函数是:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM