无法将字典<字符串、字符串>转换为从字典<字符串、字符串派生的类>

  • 本文关键字:字符串 字典 派生 转换 c# casting
  • 更新时间 :
  • 英文 :


我有一个带有嵌套字典的复杂数据结构。类似于以下内容:Dictionary<string, Dictionary<string, Dictionary<string, string>>>它根本不可读,所以我的想法是创建从Dictionary<..,..开始的类>并通过将字典强制转换为这些类来提高可读性。类似这样的东西:

private class MyKeyValues : Dictionary<string, string> {}
private class MyAssetKeyValues : Dictionary<string, MyKeyValues> {}

我的问题归结为下面的代码进行编译,但在运行时出现强制转换异常而失败。为什么我想做的事情失败了?有没有一种变通方法可以提高这些嵌套词典的可读性?

using System;
using System.Collections.Generic;
namespace ConsoleApp1
{
public class MyDictionary : Dictionary<string, string> { }
public static class Program
{
public static void Main(string[] args)
{
var dictionary = new Dictionary<string, string>
{
{ "DummyKey1", "DummyVal1"},
{ "DummyKey2", "DummyVal2"},
};
var myDictionary = (MyDictionary)dictionary;
foreach (var key in myDictionary.Keys)
{
Console.WriteLine($"Key: {key}, Val: {myDictionary[key]}");
};
}
}
}

我将从这个开始-几乎每次我看到有人从Dictionary(或List(继承时,几乎总是做错误的事情。继承意味着is-a链接,而你几乎总是想要has-a关系。作文类MyAssetKeyValues应该包含Dictionary,而不是从Dictionary继承的

然后,这一切都变得简单起来。类可能将Dictionary作为收缩参数,允许您从Dictionary中构造一个

private class MyKeyValues 
{
private readonly Dictionary<string,string> dict;
public MyKeyValues(Dictionary<string,string> dict){ this.dict = dict; }
}
var dictionary = new Dictionary<string, string>
{
{ "DummyKey1", "DummyVal1"},
{ "DummyKey2", "DummyVal2"},
};
var myDictionary = new MyKeyValues(dictionary);

请注意,您仍然可以通过实现细节使类的行为像字典一样。你可以随心所欲地嵌套这些:

private class MyAssetKeyValues {
private readonly  Dictionary<string, MyKeyValues> dict;
// .... //
}

最新更新