我有一个带有嵌套字典的复杂数据结构。类似于以下内容: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;
// .... //
}