2017-09-16 210 views
0

試圖寫,其確定一個類型是否是可分析的一個utilty方法(即,具有類似的方法:解析(字符串值)泛型 - 使用GetRuntimeMethod與類型參數

下面作品的代碼,但似乎有點kludgey:

public static bool IsParseable(Type t) { 

     string s = "foo"; 

     Type[] typeArray = { s.GetType() }; 

     if (t.GetRuntimeMethod("Parse", typeArray)==null) { 
      return false; 
     } else { 
      return true; 
     } 
    } 

好像應該有一個更好的辦法讓我的字符串類型的手然後有以打電話的GetType創建的類型(串)的一個實例()

這同樣出現試圖使用該方法,如:

bool results = IsParseable(Double); //doesn't compile. 

爲了找出double是否可解析,我必須做類似的事情。

Double v = 1.0; 
Type doubleType = v.GetType(); 
bool result = IsParseable(doubleType); 

有沒有更高效的方法?最後,我想用泛型類型,我在那裏有一個類型參數T使用此,我想看看T具有解析(字符串值)方法:

IsParseable(T)

這當然沒有按也不行。而創建一個T的實例並不是一個好的解決方案,因爲如果T有一個默認的構造函數就不知道。

+5

'IsParseable(typeof運算(雙人));' –

+0

HM。那太容易了。謝謝。 – user1023110

+0

看看這個問題https://stackoverflow.com/questions/2961656/generic-tryparse – ironstone13

回答

2

您可以使用通用的方法

public static bool IsParseable<T>() 
{ 
    var argumentTypes = new[] { typeof(string) }; 
    var type = typeof(T); 

    return type.GetRuntimeMethod("Parse", argumentTypes) != null; 
} 

// Use it 

if (IsParseable<decimal>()) 
{ 
    // Parse... 
} 

或者用你的方法與托馬斯·韋勒的提示,並進行方法的擴展方法爲Type(但從可讀性點甚至更好的(意見爲主))。

public static bool IsParseable(this Type type) 
{ 
    var argumentTypes = new[] { typeof(string) };   
    return type.GetRuntimeMethod("Parse", argumentTypes) != null; 
} 

然後使用

if (typeof(decimal).IsParseable()) 
{ 
    // Do something 
}