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

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

如果你知道要投射的是哪种类型,你将不得不最终得到这样的结果:

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

T现在是你的类型参数。

如果你知道你所使用的类型是什么,编译器也不会知道。 这是一种静态类型的语言。 如果你不喜欢这样的东西,你可能想要漫游,例如ruby。

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

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

Foo beenCast =(Foo)castMe;

如果’castMe’是除’Foo’(或派生)之外的任何其他类型,那么演员阵容无论如何都会失败,无论你想要将它投射到什么地方都很重要。

感谢弗兰克,我已经能够获得我想要工作的function。 我最后写的function是:

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

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