2016-07-28 95 views
-5

大部分鑄造得到任何幫助....新手C# - 對象在運行時

問題:在運行時被施加三種不同類型的選擇 ,希望有本地變量轉換取決於結果鍵入。

例子:

Object test; 

if (something == somethingElse) 
{ 
    test = VendorClass<VendorType> 
} 
else 
{ 
    test = OtherVendorClass<OtherVendorType> 
} 

我看了看周圍的StackOverflow,發現了一些很好的例子,如

var newVar = (OtherVendorClass<OtherVendorType>)test; 

var newVar = test as OtherVendorClass<OtherVendorType>; 

然而,所有我見過如此遠不是測試變量範圍,只是在本地創建新的變量範圍。

在此先感謝。

+1

這不是很清楚你在這裏問什麼;你可以添加更多的細節? –

+0

如何在投射後使用'test'對象? – Fabio

+0

哇....看起來像我做了一些非常錯誤的看負面投票。有人能告訴我哪裏出錯了,讓我知道嗎?謝謝 – ma11achy

回答

0

您可以使用is關鍵字對您的對象進行類型檢查。

if (myObject is MyFirstType) 
{ 
    MyFirstType obj = (MyFirstType)myObject; 
    obj.MyFirstTypeMethod(); 
} 
else if (myObject is MySecondType) 
{ 
    MySecondTypeobj = (MySecondType)myObject; 
    obj.MySecondTypeMethod(); 
} 
+0

不建議這樣做;實際上你要投射物體兩次。更好地嘗試'var foo = myObject作爲Foo;'然後測試'foo'不爲null。 –

+0

無論你是使用'obj =(MyFirstType)myObject'還是'myObject as MyFirstType',它都是你不想要的情況。它不是100%的所有時間規則,但強類型代碼應該是編寫的,以便我們已經知道我們正在處理的是什麼類型,並且不必檢查對象以找出它的類型。我們不必知道* actual *類型 - 只是它實現的接口或它繼承的基類。那麼好處是我們可以在不知道* actual *類型的情況下使用* known *類型。 –

1

如果你問如何改變變量test的類型,答案是:

你不能。您也無法根據某些條件定義具有不同類型的變量。

但是,您可以選擇一種類型爲test,它非常通用,適合您要放入的所有對象。例如,object

object test; 
if (condition) 
    test = new VendorClass<VendorType>() 
else 
    test = new OtherVendorClass<OtherVendorType>() 

此代碼是有效的,唯一的問題是,你要訪問您在test保存對象中的所有時間,你必須將它轉換回正確的類型。

if(condition) 
    ((VendorClass<VendorType>)test).vendorMethod(); 
else 
    ((OtherVendorClass<OtherVendorType>)test).vendorMethod(); 

一個更優雅的解決辦法是,要找到或定義其他類型比object,這是一般足以容納所有這些類型的,但不夠精確,有你需要訪問的所有屬性。

「一般」意思是VendorClass<T>OtherVendorClass<T>都從它繼承,但在這一點上,我會引用你的C#手冊的繼承。 (https://msdn.microsoft.com/en-us/library/ms173149.aspx

編輯:這種類型也可以是一個接口,這兩種類型都在實現。 (https://msdn.microsoft.com/en-us/library/ms173156.aspx

也可以發佈比c#手冊更好的資源,毫無疑問在C#中有更好的繼承和接口解釋。

1

問題是,如果你聲明一個變量 - test - 然後該變量可能包含一種類型,另一種類型或其他類型的對象,那麼接下來你要做什麼?強類型語言的重點在於我們知道每個對象的類型,或者至少知道它的類型。

如果這些不同類型都實現一些常用的接口,那麼你可以這樣做:

ISomeCommonInterface myObject = null; 

if(something == true) 
    myObject = new SomethingThatImplementsThatCommonInterface(); 
else 
    myObject = new SomethingElseThatImplementsThatCommonInterface(); 

我並不是說這是很好的做法,但它的作品。展望未來,你知道myObjectISomeCommonInterface的一個實例。所以你處理這個接口,不再關心實際的實現是什麼。

(這也適用,如果從類型聲明的類型繼承,或一個是聲明的類型和其他人繼承。)

否則所有你能做的就是聲明你的變量爲object型。現在你可以指定任何你想要的類型,但是又一次挫敗了強打字的目的。我們總是希望將某個對象轉換爲某種已知的預定類型,以便我們知道如何使用它或與其進行交互。我們從不想要object然後實現「如果它是這種類型,則調用此方法,但如果它是這種類型,則調用該方法。」

+0

謝謝!我學到了什麼不該做:) – ma11achy

+1

不客氣!作爲一般的經驗法則,如果我們將變量聲明爲'object',或者如果我們有一個對象,並且我們正在編寫任何代碼來試圖找出它的類型,那麼就會出現問題。 (這些都不是絕對的,但它們會讓你走得更遠。) –