2016-08-01 78 views
1

如果我有如何將字典轉換爲我的類實現相同類型的字典?

public class Stats : Dictionary<string, double> 
{ 
} 

public class Info : Dictionary<string, Stats> 
{ 
} 

var data = new Dictionary<string, Dictionary<string, double>> { 
    { "1", new Dictionary<string, double> { { "a", 11 } } }, 
    { "2", new Dictionary<string, double> { { "aa", 111 } } }, 
}; 

爲什麼我不能做:

var test = (Info)data; 

?我需要爲了能夠使用什麼運營商或代碼實例我的

[class inheriting from a Dictionary<string, Dictionary<string, double>>]

from a

Dictionary<string, Dictionary<string, double>>

+0

您不能從基類實例化,然後將其用作繼承類的對象。你想怎麼做? –

+0

@AshkanSirous:那麼該類只是清理代碼,並使用我的類名稱,而不是'Dictionary >'無處不在 – ibiza

+0

我想你有這個對象的一些功能。對?創建一個類並將該對象作爲該類的屬性並將其封裝爲功能。順便說一下,它似乎是一個錯誤的設計給我。你想用1個鍵有2個值嗎?你爲什麼有一本字典的字典? –

回答

3

有真的在這裏你的方法,兩個不同的錯誤:

  1. Dictionary<string, Stats>是不一樣的Dictionary<string, Dictionary<string, double>>。將Info視爲繼承Dictionary<string, Dictionary<string, double>>是錯誤的。它繼承Dictionary<string, Stats>,這是完全不同的。
  2. 即使您獲得了正確的基本類型,也無法將基本類型的任何隨機實例轉換爲派生類型。請參閱Convert/Cast base type to Derived type以獲取許多現有的堆棧溢出問題之一Q &討論此問題的主題。

沒有好的Minimal, Complete, and Verifiable code example這是不可能確切知道你的代碼是如何工作或將需要什麼來得到它做你想要的。但是在你的特定例子中,你可能會聲明一個顯式的轉換,當你使用轉換操作符的時候會被調用。

例如:

public class Info : Dictionary<string, Stats> 
{ 
    public static explicit operator Info(Dictionary<string, Dictionary<string, double>> source) 
    { 
     Info result = new Info(); 

     foreach (var kvp in source) 
     { 
      result.Add(kvp.Key, Stats.FromDictionary(kvp.Value)); 
     } 

     return result; 
    } 
} 

其中:

public class Stats : Dictionary<string, double> 
{ 
    public static Stats FromDictionary(Dictionary<string, double> source) 
    { 
     Stats result = new Stats(); 

     foreach (var kvp in source) 
     { 
      result.Add(kvp.Key, kvp.Value); 
     } 

     return result; 
    } 
} 

理想情況下,我們希望能夠做同樣的事情在Info

public class Stats : Dictionary<string, double> 
{ 
    public static explicit operator Stats(Dictionary<string, double> source) 
    { 
     Stats result = new Stats(); 

     foreach (var kvp in source) 
     { 
      result.Add(kvp.Key, kvp.Value); 
     } 

     return result; 
    } 
} 

但是,這是一個編譯器錯誤:

Stats.explicit operator Stats(System.Collections.Generic.Dictionary)': user-defined conversions to or from a base class are not allowed

這裏更詳細地解決這個問題:User-defined conversion operator from base class。簡短的版本是,如果編譯器允許這樣做,那麼如果您試圖從基礎引用強制轉換爲派生引用,那麼意圖是什麼將是不明確的。在這種情況下,語言迫使你明確表達。

然後你要使用的語句將工作:

var test = (Info)data; 

所有這一切說,在評論中你寫了這個:

the class is just to clean up code and use my class name instead of Dictionary<string, Dictionary<string, double>> everywhere

如果是這樣的話,那麼代替繼承,也許你只是想使用類型名稱別名。例如:

using Stats = System.Collections.Generic.Dictionary<string, double>; 
using Info = System.Collections.Generic 
    .Dictionary<string, System.Collections.Generic.Dictionary<string, double>>; 

然後你就可以互換,分別Dictionary<string, double>Dictionary<string, Dictionary<string, double>>,使用的名稱StatsInfo

+0

我學會了一個很好的代碼。謝謝。 :)順便說一句,我從來沒有在這種情況下結束。爲什麼有人需要一本字典的字典。對我來說似乎有點奇怪 –

+0

哦哇,非常感謝你所有這些好的信息 – ibiza

+0

我得到一個錯誤'Stats.explicit operator Stats(System.Collections.Generic.Dictionary )':用戶定義的轉換在統計數據顯式運算符的聲明中不允許使用基類或基類「...你會碰巧知道爲什麼嗎? – ibiza