为大型构造创建自定义类型

时间:2015-11-04 11:52:53

标签: c#

我有一个返回Tuple的方法,它包含两个词典

Tuple<Dictionary<string, ICustomProperty>, Dictionary<string, ICustomProperty>> GetDictionaries();

所以我为这种类型创建了两个类。

public class PropertyDictionary : Dictionary<string, ICustomProperty>{}

public class PropertyDictionaryTuple : Tuple<PropertyDictionary, PropertyDictionary>
    {
        public PropertyDictionaryTuple(PropertyDictionary fromFluxData, PropertyDictionary localData)
            : base(fromFluxData, localData)
        {
        }
    }

但是当我尝试做这样的事情时:

PropertyDictionaryTuple data = GetDictionaries();

我有错误:

  

无法隐式转换类型'System.Tuple,Syst em.Collections.Generic.Dictionary&gt;'到'PropertyDictionaryTuple'

如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

PropertyDictionaryTuple来自Tuple<PropertyDictionary, PropertyDictionary>的事实并不意味着每Tuple<PropertyDictionary, PropertyDictionary>都是PropertyDictionaryTuple

PropertyDictionaryTuple不是特定Tuple<PropertyDictionary, PropertyDictionary>的别名 - 它是一种全新类型,可以有自己的字段和方法等。

通常,继承允许您降低类型的泛化 - 例如,您可以将string的值分配给object的变量。如果可以将任何object投射到string,那么它实际上可以反过来工作......那么它将如何运作?

如果要将较不具体的类型转换为更具体的类型,则需要自己实现转换。例如,

var dictionaries = GetDictionaries();
var pdt =
  new PropertyDictionaryTuple
  (
    new PropertyDictionary(dictionaries.Item1), 
    new PropertyDictionary(dictionaries.Item2)
  );

(您还需要实现创建原始字典副本的PropertyDictionary构造函数)

这当然会创建一个 new PropertyDictionaryTuple,里面有两个 new 词典。

或者只需更改GetDictionaries方法即可直接返回(并创建)PropertyDictionaryTuple

修改

PropertyDictionary定义可能如下所示:

public class PropertyDictionary : Dictionary<string, ICustomProperty>
{
  public PropertyDictionary(Dictionary<string, ICustomProperty> dict)
    : base(dict)
  {}
}