2009-10-10 83 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")) 

顯然,你需要知道你想要情況在編譯的時候(我)的類型,但是這是一個非常好的簡化方法,可以替換爲每種不同的類型分別編寫一個單獨的方法,這些方法可能需要投入。

相關問題