Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法转换字典<;字符串,字符串>;从字典传下来的类<;字符串,字符串>;_C#_Casting - Fatal编程技术网

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很棒!我很高兴这有帮助。