2012-09-17 60 views
2

我必須將一個對象轉換爲一個對象,其中我只是將typename作爲一個字符串。Cast FullTypeName

例如:

我有型串System.DateTime和字符串2012-09-17T10:19:23.5369243+02:00。現在我想要一個DateTime的對象與字符串的值。

這可能嗎?

+1

通常,這是不可能的,因爲類的字符串表示通常不包含所有數據以從中重建對象。例如,考慮一個嵌套對象圖。話雖如此,但對於某些類型來說是完全可能的。 –

+0

這是可能的,但它不是演員。請參閱[DateTime.Parse](http://msdn.microsoft.com/en-us/library/ey1cdcx8(v = vs.100).aspx)。不幸的是,沒有任何通用的方法可以實現所有類型(可能是因爲從字符串轉換到字符串意味着很多不重要的細節,例如語言環境和自定義表示)。 –

+0

字符串到日期時間:http://msdn.microsoft.com/en-us/library/cc165448.aspx,在一般意義上,這可能很難做到所有類型的對象。 –

回答

1

您的問題的答案可以在所有其他答案中找到,等待拼湊在一起。:)

  1. 從類型字符串獲取的類型,像akhisp說:

    Type dateTimeType = Type.GetType("System.DateTime"); 
    
  2. 現在,使用一個類型轉換爲字符串更改爲日期時間:

    object date = Convert.ChangeType("2012-09-17T10:19:23.5369243+02:00", dateTimeType); 
    
0

我會做的是使用Type.GetType(String)方法來獲取對象的類型。 然後,我會調用Activator.CreateInstance(Type Object [])來構造該對象的一個​​實例,假設您知道有一個構造函數接受一個字符串。

+0

但是,即使日期時間不具備這樣的構造。此外,即使存在,並且即使我們可以假設這是我們需要的,我們仍然有字符串格式的問題... –

1

通常這種轉換不會通過演員公開。這有很多原因(對於另一個問題它可能是一個不錯的主題)。

有時,對象的字符串表示形式對於該對象來說非常「標準」。例如,一個顏色可能總是被序列化爲逗號分隔的RGB三元組。

例如,當需要解析的類型引入依賴語言環境的表示形式時,情況變得更加困難:例如,日期。在這種情況下,框架設計人員決定不引入像IParseable這樣的接口,並使用第3個對象:TypeConverter s,TypeDescriptor和轉換類來完成這種工作。它使你的代碼更復雜,但它允許管理非常複雜的轉換將這項工作委託給另一個類,看看到:

對於基本類型,你可能甚至不需要使用它們:你可以依靠IConvertible接口和System.Convert類。

你不能用鑄造做(感謝上帝,在我看來),但你可以寫一個通用Parse方法接受一個string並返回你所需要的類型,是這樣的:

T Parse<T>(string value) 

對於我記得有一個很好的開源類型轉換庫(Universal Type Converter)。它使用它可能發現的將所有類型轉換爲另一個類型的所有內容來管理大量轉換(例如,想象一下,您可以使用多少個不同的字符串表示來爲bool值)。即使你不會直接使用它,你應該閱讀這篇文章,以瞭解這些東西是如何工作的(以及查看源代碼以查看角落案例是如何處理的)。

+0

我認爲這個問題是關於更多的東西:在*類型*也是一個字符串,而不僅僅是物體。 – svick

+0

@svick你是對的,這是微不足道的,但他可以去看一下[此帖](http://stackoverflow.com/questions/10938067/creating-an-object-from-from-an-id-or-名稱/ 10938166#10938166)。 –