2016-02-04 31 views
2

我想在c#中編寫一個通用函數,它試圖根據類型解析一個字符串。如何在c#中編寫通用函數?

這裏是我試過

public static T convertString<T>(string raw) 
    { 
     if(typeof(T) == DateTime){ 
      DateTime final; 
      DateTime.TryParseExact(raw, "yyyy-mm-dd hh:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.None, out final); 
      return final; 
     } 

     if(typeof(T) == int){ 
      int final; 
      Int32.TryParse(raw, out final); 
      return final; 
     } 

    } 

我怎樣才能糾正此功能工作?

+1

基於'T'類型具有非常不同實現的泛型通常沒有意義。你可以調用'convertString ',你的方法不知道如何處理它。 –

+0

@EricJ。你能給我舉個例子嗎? –

+1

@MikeA一個什麼樣的例子? – Servy

回答

3

你可以嘗試這樣的事情:

public static T ConvertFromString<T>(string raw) 
{ 
    return (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFromString(raw); 
} 

// Usage 
var date = ConvertFromString<DateTime>("2015/01/01"); 
var number = ConvertFromString<int>("2015"); 

編輯:支持TryConvert

否則,您可以創建一個功能,將嘗試將輸入字符串轉換:

public static bool TryConvertFromString<T>(string raw, out T result) 
{ 
    result = default(T); 
    var converter = TypeDescriptor.GetConverter(typeof (T)); 
    if (!converter.IsValid(raw)) return false; 

    result = (T)converter.ConvertFromString(raw); 
    return true; 
} 

// Usage 
DateTime result; 
if (!TryConvertFromString<DateTime>("this is not a date", out result)) 
{ 

} 
+0

你能解釋一下嗎?這是如何工作的?這將如何嘗試解析日期時間或int? –

+0

@MikeA,我已更新我的帖子。你需要解釋一般泛型如何工作? – Thomas

+0

謝謝。如果我執行這個'convertString (「Mike A」)'這會給我一個錯誤還是會返回一個不正確的值? –

0

你甚至可以做到這一點更通用,不要依賴字符串參數,只要U型實現IConvertible - 這意味着但是您必須指定兩個類型參數:

public static T ConvertValue<T,U>(U value) where U : IConvertible 
    { 
     return (T)Convert.ChangeType(value, typeof(T)); 
    } 
+0

我認爲你需要檢查你是否可以將U轉換爲T之前? – Thomas