2013-10-04 19 views
0

場景: 我有一個實用的方法來執行keyvaluepair的鍵操作。鍵總是int,但該值可以是任何類型的對象。我不需要知道價值是什麼樣的對象。 當我嘗試執行假定所有對象都是對象子類型的操作時,它不起作用。如何處理所有類型的值檢查keyvaluepair

object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      if (value is KeyValuePair<int, object >) //this check doesn't return true 
      { 
      } 
     } 

是否有任何方式使用它泛化,或者我必須檢查每個值類型的條件。

回答

1

您可以使用此:

Type t = value.GetType().GetGenericTypeDefinition(); 

if (t == typeof(KeyValuePair<,>)) 
{ 

} 

提醒: 你應該先檢查是否一個t.IsGenericType(看喬恩的職位),並檢查值分配

+0

如果't'不是泛型類型,這會炸掉。 – Jon

+0

是的,這只是一個例子,見過你。 :) –

1

這是不可能一概而論這。您手邊有一個object,使用它的唯一方法是將其轉換回其確切類型,包括類型參數。

「其他」選項是使用反射,但會有很大的不同。例如:

var t = value.GetType(); 
if (t.IsGenericType) { 
    if (t.GetGenericTypeDefinition() == typeof(KeyValuePair<,>)) { 
     // OK, it's some type of KVP 
     var args = t.GetGenericArguments(); 
     if (args[0] == typeof(int)) { 
      // The Key type is int 
     } 
    } 
} 
+0

這將爆炸,如果'value' == null;) –

+0

@JeroenvanLangen:哈哈,touche。無論如何,我的觀點是,既然'Convert'示例檢查「任何」類型的KVP,我們不應該假設'value'是KVP。 – Jon

+0

很好又完整的例子,你會得到一個+1 –