我知道之前已经问过这样的问题,我怀疑这是可能的,但我只是想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
。
答案 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"))
显然你需要在编译时知道你想要的类型(我这样做),但这是一个非常好的简写,可以替换你可能想要为每个不同类型编写一个单独的方法。