2010-02-24 50 views
3

如果「價值」是傳入通用字典,其類型是未知的/沒有關係,我該如何利用其條目,並付諸IDictionary<object, object>類型的對象字典?如何處理類型未知且通用的字典?

if(type == typeof(IDictionary<,>)) 
{ 
    // this doesn't compile 
    // value is passed into the method as object and must be cast  
    IDictionary<,> sourceDictionary = (IDictionary<,>)value; 

    IDictionary<object,object> targetDictionary = new Dictionary<object,object>(); 

    // this doesn't compile 
    foreach (KeyValuePair<,> sourcePair in sourceDictionary) 
    { 
     targetDictionary.Insert(sourcePair.Key, sourcePair.Value); 
    } 

    return targetDictionary; 
} 

編輯:

感謝到目前爲止的響應。

的這裏的問題是,參數複製僅稱爲類型「對象」。例如:

public void CopyCaller(object obj) 
{ 
    if(obj.GetType() == typeof(IDictionary<,>) 
     Copy(dictObj); // this doesn't compile 
} 
+0

如果你使用'IDictionary'你弱類型的字典,而不是'的IDictionary <對象,對象>',你可以只需返回'詞典'。 – 2010-02-27 02:50:29

+0

正如我在調用者的代碼無法控制我不能使用IDicitionary。 – 2010-02-27 12:56:06

回答

-1

這可能對您有用,但您需要.net 3.5或更高版本才能使用var關鍵字。

// this should compile 
foreach (var sourcePair in sourceDictionary) 
{ 
    targetDictionary.Insert(sourcePair.Key, sourcePair.Value); 
} 
+2

'var'是一種方便的方法,可以讓編譯器從使用中推斷出類型。這在上面使用的許多步驟中都是不可能的,比如在'typeof()'檢查或者演員表中。 – 2010-02-24 05:19:25

+0

同意。 var在運行時使用與使用對象相同的方式。 – lkg 2010-02-24 06:19:00

+4

@karbon,不,'var'不喜歡使用'object'。 'var'就像明確指定完整類型一樣,只是你不這樣做,編譯器會在**編譯時從代碼中計算出來**。 'var'對運行時代碼有**零**影響。 – 2010-02-27 03:32:49

5

使你的方法是通用的,然後你就可以做你正在做的事情。你不需要改變你的使用模式,因爲編譯器可以從輸入類型中推斷出泛型。

public IDictionary<object, object> Copy(IDictionary<TKey, TValue> source) 
{ 

    IDictionary<object,object> targetDictionary = new Dictionary<object,object>(); 

    foreach (KeyValuePair<TKey, TValue> sourcePair in sourceDictionary) 
    { 
     targetDictionary.Insert(sourcePair.Key, sourcePair.Value); 
    } 

    return targetDictionary; 
} 

如果你並不真的需要把它從IDictionary<TKey, TValue>轉換爲IDictionary<object, object>那麼你可以使用的Dictionary<TKey, TValue>副本constuctor它接受另一個字典作爲輸入,並將所有值 - 就像你現在做的事情。

+0

我喜歡這個答案。它很簡潔。 – lkg 2010-02-24 06:15:08

+0

我拿出了「這個不編譯」的行,因爲你的版本*不能*編譯。希望你不介意! – Aaronaught 2010-02-27 02:38:09

+0

@Aaronaught,感謝 – 2010-02-27 03:31:38

1

這裏有一個方法(不要將其作爲靜態的,除非你需要它,我寫了一個快速的控制檯應用程序),任何類型的字典基本上轉換爲一個對象/對象字典。

private static Dictionary<object,object> DeTypeDictionary<T,U>(Dictionary<T,U> inputDictionary) 
    { 
     Dictionary<object, object> returnDictionary = new Dictionary<object, object>(); 
     foreach(T key in inputDictionary.Keys) 
     { 
      if((key is object) && (inputDictionary[key] is object)) 
      { 
       returnDictionary.Add(key, inputDictionary[key]); 
      } 
      else 
      { 
       //sorry these aren't objects. they may be dynamics. 
       continue; 
      } 

     } 
     return returnDictionary; 
    } 

...這裏是你如何使用它...

 Dictionary<string, DateTime> d = new Dictionary<string, DateTime>(); 
     d.Add("rsgfdg", DateTime.Now); 
     d.Add("gfdsgd", DateTime.Now); 

     Dictionary<object, object> newDictionary = DeTypeDictionary<string, DateTime>(d); 
+0

你能提供的其中'鍵object'會是假的例子嗎?即使在.NET 4中有動態變化,它也提供了動態變量和參數,但是,afaik不是泛型聲明的動態類型。 – 2010-02-24 05:46:46

+0

你說得對。在編譯時,動態是動態的,但是像var一樣,它們變成運行時對象,所以在運行時它們總是對象。 – lkg 2010-02-24 06:14:45