2009-10-10 37 views
0

我知道这样的问题之前已经被问过了,我怀疑这是可能的,但我只是想让100%确定它不是。我想将一个变量转换为由另一个Type变量表示的类型。在VB.net或C#中(无论哪种语言都无关紧要),我想将变量转换为由另一个Type变量表示的类型。下面是样的代码,将在C#中需要的一个例子:将变量转换为由另一个Type变量表示的类型?

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))。我不太明白为什么你不能这样做,尽管......当然,运行时转换错误可能会导致,但是当你指定编译时类型时,你也可以得到它们。如果castMe不是Foo的实例,那么即使CType(castMe, Foo)仍会抛出InvalidCastException

回答

4

如果知道你想投你就会有这样的事情结束了,其类型:

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

牛逼现在是你的类型参数。

如果你不知道知道你输入的类型是什么,编译器也不知道。这是一个静态类型的语言给你。如果你不喜欢这样的事情,你可能想要通过例如漫游。红宝石。

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

+0

谢谢;那种通用的方法就是我需要的东西!看到我对这个问题的回答,看看我最终写的功能。 – Jez 2009-10-10 10:56:56

1

由于您将最终被分配到铸造一个“富”,则可以只写

美孚beenCast =(美孚)castMe;

如果'castMe'是除'Foo'(或派生)之外的任何其他类型,那么演员表无论如何都会失败,无论您尝试将其转换为什么都无关紧要。

0

感谢弗兰克,我已经能够获得我想工作,工作的功能。我结束了写作的功能是:

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

显然,你需要知道你想要情况在编译的时候(我)的类型,但是这是一个非常好的简化方法,可以替换为每种不同的类型分别编写一个单独的方法,这些方法可能需要投入。

相关问题