2016-08-01 51 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