2012-05-04 42 views
0

我想寫一個通用的轉換函數,但我不知道我該怎麼做。這是我的骨架:如何編寫通用轉換函數?

public static T ConvertByGenerics<T>(string value) 
     { 
      //what do I write here? 
      return default(T); 
     } 

有人可以幫我嗎?我在函數中寫入什麼來動態地將字符串轉換爲T類型?像

+0

您希望_any_類型可以從字符串中解析出來嗎? – Oded

+0

是的,有點。如果我說ConvertByGenerics (「10」),它應該給我10個整數。 – Jack

+0

你可以看到下面的帖子 http://stackoverflow.com/questions/6884653/how-to-make-a-generic-type-cast-function – Waqar

回答

2

試試:

public T ConvertByGenerics<T>(string value, T defaultValue) 
{ 
    if (!string.IsNullOrEmpty(value)) 
    { 
     return (T)Convert.ChangeType(value, typeof(T)); 
    } 

    return defaultValue; 
} 
+0

優秀!只需要刪除屬性。我不知道那是什麼! – Jack

+3

對於大多數類型,這將會失敗並導致無效投射。 – Oded

+0

@Oded:這個答案是我想要的!我只需要簡單的轉換。不希望在字符串中創建像Person/Employee這樣的複雜對象類型。我不確定誰低估了這個答案。 – Jack

0

你想要什麼是不可能的。

爲了支持任何可能的類型,你需要知道它是如何被表示爲一個字符串 - 一些內置的值類型有Parse方法是「理解」串的某些格式,並可以把它解析爲類型,但是對於每種可能的類型絕對沒有辦法一般地做到這一點。

您需要編寫代碼將字符串轉換爲每種類型 - 這對於現有的每種類型都是不可行的。

+0

請閱讀devdigital的回答。 – Jack

+0

@TomKaufmann - 試試吧。祝你好運。它不適用於_most_類型。 – Oded

+0

它適用於我的情況。我只需要簡單的轉換。顯然,我不能傳遞一個Person/Employee類型,並期望Person/Employee對象不在字符串中:p。 – Jack

1

還有更多的事情可以嘗試,但它們涉及動態方法。 代碼片段中沒有足夠的異常處理,當然可以進行一些優化。

public static T ConvertByGenerics<T>(string input) { 

    // be mindful of boxing 
    if (input is T) { 
     return (T)(object)input; 
    } 

    if (input == null) { 
     // throw arugment exception 
    } 

    // can check for int, long ...... 
    if (typeof(T).IsEnum) { 
     return (T)System.Enum.Parse(typeof(T), input, true); 
    } 

    if (typeof(T).IsAssignableFrom(typeof(string))) { 
     return (T)(object)input; 
    } 

    try { 
     return (T)Convert.ChangeType(input, typeof(T)); 
    } 
    catch { //do nothing 
    } 

    // might want to cache some converters 
    System.ComponentModel.TypeConverter converter = System.ComponentModel.TypeDescriptor.GetConverter(typeof(T)); 
    if (converter.CanConvertFrom(typeof(string))) { 
     return (T)converter.ConvertFrom(input); 
    } 
    else { 
     // better though to throw an exception here 
     return default(T); 
    } 
}