2015-12-22 90 views
0

我有以下功能。我想調用並將一個字符串轉換爲int32。怎麼做我打這個功能?調用函數Func <string,T>

靜態函數功能GetConverter(T示例)

static Func<string, T> GetConverter<T>(T example) 
      { 
       return (x) => Convert<T>(x); 
      } 

這是用於轉換的代碼。我從StackOverflow得到了這段代碼,但不知道如何使用。

static T Convert<T>(string val) 
    { 
     Type destiny = typeof(T); 

     // See if we can cast   
     try 
     { 
      return (T)(object)val; 
     } 
     catch { } 

     // See if we can parse 
     try 
     { 
      return (T)destiny.InvokeMember("Parse", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.Public, null, null, new object[] { val }); 
     } 
     catch { } 

     // See if we can convert 
     try 
     { 
      Type convertType = typeof(Convert); 
      return (T)convertType.InvokeMember("To" + destiny.Name, System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.Public, null, null, new object[] { val }); 
     } 
     catch { } 

     // Give up 
     return default(T); 
    } 
+0

您已經知道目標類型(int),那麼爲什麼不使用int.Parse或int.TryParse方法呢? –

+0

我需要創建一個動態數據類型轉換器。至於現在我知道它的字符串爲int。但後來我希望它能夠動態工作。 – Kanes

回答

0

如果您必須使用GetConverter方法,您應該先調用它來獲取轉換器函數。

假設GetConverter下A類命名爲:

int value = 0; 
var converter = A.GetConverter(value); 

,那麼你可以調用從GetConverter方法轉換器就像一個本地函數:

value = converter("123"); 

我覺得你不必傳遞參數給GetConverter函數。這個實現是更好,因爲你不使用示例參數:所以現在

static Func<string, T> GetConverter<T>() 
{ 
    return (x) => Convert<T>(x); 
} 

你可以用它喜歡:

var converter = A.GetConverter<int>(); 
int value = converter("123"); 

PS:不是,如果你知道自己的目標,您可以使用int.TryParse法(INT )和源(字符串)類型。或者你可以使用轉換器函數本身而不需要另外的函數來包裝它,如:Convert < int>(「123」)

+0

真棒...這工作。謝謝 – Kanes

相關問題