将变量转换为另一个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"))
显然你需要在编译时知道你想要的类型(我这样做),但这是一个非常好的简写,可以替换为你可能想要转换的每个不同类型编写一个单独的方法。