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

时间:2009-10-10 10:33:31

标签: c# vb.net casting

我知道之前已经问过这样的问题,我怀疑这是可能的,但我只是想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()

最大的问题显然是指定一个方法,该方法将在运行时为cast类型参数返回Type,而不是实际的编译时类型(即CType(castMe, Foo))。我不太明白为什么你不能这样做,但是......当然,可能会导致运行时转换错误,但是当你指定编译时类型时也可以得到它们。如果castMe不是Foo的实例,那么即使CType(castMe, Foo)仍会抛出InvalidCastException

3 个答案:

答案 0 :(得分:4)

如果您 知道您要投放的是哪种类型,那么您必须得到以下内容:

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

T现在是你的类型参数。

如果您知道您所投射的类型,编译器也无法知道。这是一种静态类型的语言。如果你不喜欢这样的东西,你可能想要漫游,例如红宝石。

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

答案 1 :(得分:1)

由于你最终将演员阵容分配给'Foo',你可以写

Foo beenCast =(Foo)castMe;

如果'castMe'是除'Foo'(或派生)之外的任何其他类型,则无论如何都会失败,无论如何你都试图将它投射到它。

答案 2 :(得分:0)

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

显然你需要在编译时知道你想要的类型(我这样做),但这是一个非常好的简写,可以替换你可能想要为每个不同类型编写一个单独的方法。