2012-07-06 58 views
0

我的函數接收一個參數'值',類型對象。我想將它分配給一個對象的成員,但是這個轉換不會隱式發生,所以我需要明確地指定它。不過,我不想竟指定當前類型的對象成員,所以我可以這樣做:動態確定類型投到(C#)

positiveOrder.OrderID = (int)value; 

但是,如果業務需求的變化和OrderIDs生成並存儲在不同的方式,包括一個類型改變爲字符串爲GUIDS例如,我將不得不回到這裏並改變它,這是不希望的凝聚力。我已經與不同的代碼排列嘗試像

positiveOrder.OrderID = value as thisOrder.OrderID.GetType(); 

positiveOrder.OrderID = (typeof(thisOrder.OrderID)) value; 

,但似乎沒有奏效。以編程方式指定要轉換的類型的任何想法?它可以在編譯時或運行時完成,因爲Order類不會更改。

+2

「如果明天我更改Order類以將其OrderID成員保存爲String,而不是」爲什麼要這樣做?而這又如何影響'價值'的類型(這也可能會改變)? – Codesleuth 2012-07-06 12:44:49

+0

值總是作爲對象發送,通過代碼我不控制。該代碼不知道我的實現細節,這就是爲什麼它發送它離開鑄件給我。根據不斷變化的業務需求,我可能必須更改OrderID的類型。現在,我在模型中使用了簡單的增量整數,但在最終的應用程序中,我可能會使用字符串來代替。我只是不想通過指定兩次OrderID的類型來重複自己,這樣如果我必須更改它,我不需要更改它兩次。這是一個比功能性問題更好的設計問題。 – Neil 2012-07-06 17:04:54

回答

2

如果positiveOrder.OrderID永遠是(即使代表了一個字符串的整數),不更改成員是什麼,但一個整數。相反,公開一些可以處理不同源類型的方法。

例如:

public void SetOrderID(object value) 
{ 
    this.OrderID = Convert.ToInt32(value); 
} 

參見Convert.ToInt32()

+0

感謝codesleuth,但正如你將從我對這個問題的評論中看到的,這不是我想要爲之做好準備。我只是希望這種轉換能夠不依賴於OrderID的底層類型,它可以根據需要更改爲任何類型和類型(文本,數字,GUID)。但是,是的,如果實際ID保持不變,只是實際表示發生了變化,然後將它們轉換爲整數將是正確的選擇。 – Neil 2012-07-06 17:09:03

+0

其實這讓我想到了,你是對的,我可以在Order類中包含一個setter函數來執行投射。它仍然會提到兩次OrderID的類型,但至少它會在同一個類中!我發現應該在類型之間進行轉換的方法,但是仍然需要以某種奇怪的原因投射(Convert.ChangeType)。我認爲這個解決方案可能是實現對未被破壞的東西的修復的最小開銷。 – Neil 2012-07-06 17:26:56

0

喜歡的東西:

using System.Reflection; 

receiver.GetType().GetProperty(propName).SetValue(receiver, value, null); 
+0

謝謝,我沒有完全得到你的代碼在開始時所做的,但它給了我很好的谷歌飼料達到這個問題:http://stackoverflow.com/questions/7616177/convert-to-a-type-在飛行中的網絡,這似乎是我所需要的,現在試試吧... – Neil 2012-07-06 17:12:48