2011-01-05 35 views
1

我編程方法來查詢東西控制檯上的用戶,並得到他的回答......事情是這樣的:如何將內置結構體轉換爲C#上的參數類型T?

static T query<T>(String queryTxt) 
    { 
     Console.Write("{0} = ", queryTxt); 
     T result; 
     while (true) 
     { 
      try 
      { 
       result = // here should go the type casting of Console.ReadLine(); 
      } 
      catch (FormatException e) 
      { 
       Console.WriteLine("Exception: {0};\r\nSource: {1}", e.Message, e.Source); 
       continue; 
      } 
      break; 
     } 
     return result; 
    } 

總之,這種方法應該繼續要求的queryTxt,其中值T總是intdouble ...

任何好的方法來做到這一點?

在此先感謝!

回答

2

使用type converters

public static T Query<T>() { 
    var converter = TypeDescriptor.GetConverter(typeof (T)); 
    if (!converter.CanConvertFrom(typeof(String))) 
     throw new NotSupportedException("Can not parse " + typeof(T).Name + "from String."); 

    var input = Console.ReadLine(); 

    while (true) { 
     try { 
      // TODO: Use ConvertFromInvariantString depending on culture. 
      return (T)converter.ConvertFromString(input); 
     } catch (Exception ex) { 
      // ... 
     } 
    } 
} 
2

如果它始終爲int或double double.Parse,它將始終工作。

+0

但是該方法的返回類型呢?對不起,我沒有明白... – Girardi 2011-01-05 23:21:12

+0

T與返回類型沒有任何問題只是嘗試代碼,但如果你需要支持比int更多並且雙重做西蒙寫的 – 2011-01-05 23:26:13

1

推廣它的一種方法是將轉換函數作爲委託來傳遞。喜歡的東西:

T query<T>(string text, Func<string, T> converter) 
{... result = converter(Console.Readline())...} 
query("foo", s=>Int.Parse(s)); 

對於更通用的方法 - 讀「廣義類型轉換 」 http://msdn.microsoft.com/en-us/library/yy580hbd.aspx及有關物品。

+0

這也是一個很好的答案,儘管我選擇了其他。但這是我想要克服的另一個問題(將謂詞作爲參數傳遞給方法)。謝謝! – Girardi 2011-01-06 00:11:23

相關問題