C# 无法转换字典<;字符串,字符串>;从字典传下来的类<;字符串,字符串>;
我有一个嵌套字典的复杂数据结构。 类似这样的内容:C# 无法转换字典<;字符串,字符串>;从字典传下来的类<;字符串,字符串>;,c#,casting,C#,Casting,我有一个嵌套字典的复杂数据结构。 类似这样的内容:Dictionary 这是不可读的,所以我的想法是从字典中创建类,并通过将字典转换到这些类来提高可读性。大概是这样的: private class MyKeyValues : Dictionary<string, string> {} private class MyAssetKeyValues : Dictionary<string, MyKeyValues> {} 私有类MyKeyValues:字典{} 私有类MyA
Dictionary
这是不可读的,所以我的想法是从字典中创建类,并通过将字典转换到这些类来提高可读性。大概是这样的:
private class MyKeyValues : Dictionary<string, string> {}
private class MyAssetKeyValues : Dictionary<string, MyKeyValues> {}
私有类MyKeyValues:字典{}
私有类MyAssetKeyValues:字典{}
我的问题可以归结为下面的代码,该代码进行编译,但在运行时失败并出现强制转换异常。
为什么我要做的是失败?是否有一种解决方法来提高这些嵌套字典的可读性
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]}");
};
}
}
}
使用系统;
使用System.Collections.Generic;
名称空间控制台EAPP1
{
公共类MyDictionary:字典{}
公共静态类程序
{
公共静态void Main(字符串[]args)
{
var字典=新字典
{
{“DummyKey1”,“DummyVal1”},
{“DummyKey2”,“DummyVal2”},
};
var myDictionary=(myDictionary)dictionary;
foreach(myDictionary.Keys中的var键)
{
WriteLine($“Key:{Key},Val:{myDictionary[Key]}”);
};
}
}
}
我将从这一点开始——几乎每次我看到有人从字典
(或列表
)继承时,这几乎总是错误的。继承意味着一个is-a
链接,而您几乎总是想要一个has-a
关系。作文您的类MyAssetKeyValues
应该包含一个字典
而不是从字典
继承
然后,所有这些都变得简单了。类可以将字典
作为收缩器参数,允许您从字典
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);
私有类MyKeyValues
{
专用只读词典;
public MyKeyValues(Dictionary dict){this.dict=dict;}
}
var字典=新字典
{
{“DummyKey1”,“DummyVal1”},
{“DummyKey2”,“DummyVal2”},
};
var myDictionary=新的mykeyvalue(dictionary);
注意,您仍然可以通过实现细节使类的行为像字典一样。您可以任意嵌套这些:
private class MyAssetKeyValues {
private readonly Dictionary<string, MyKeyValues> dict;
// .... //
}
私有类MyAssetKeyValues{
专用只读词典;
// .... //
}
您试图从不是MyDictionary
的对象强制转换到MyDictionary
。这样说吧-您希望这段代码能够工作吗<代码>对象o=新对象();字符串文本=(字符串)o代码>?如果你这样做了,你会期望那根绳子看起来像什么?你的例子只是一个更复杂的例子。如果希望能够强制转换到MyDictionary
,则需要创建MyDictionary
的实例(或子类)。就个人而言,我不鼓励这种通用方法,请注意——创建继承层次结构只是为了避免长名称通常不是一种好的长期方法,当然,这并不意味着您需要完全避免抽象——只是值得考虑更多的抽象,而不仅仅是从字典
派生类。考虑编写一本字典,并提供一个更高级别的抽象,这是特定于您的用例的。感谢@JonSkeetThanks@Jamiec的澄清。我实施了你们的建议,它在可读性方面帮助很大。@Allansimensen很棒!我很高兴这有帮助。