创建和初始化从字典派生的类

时间:2018-10-03 08:19:16

标签: c#

说我有以下类定义:

public class MyClass : Dictionary<int, string>
{
}

如何从类似这样的表达式中创建一个(不起作用)?

MyClass myClass = myList.ToDictionary(l => l.Key, l => l.value);

3 个答案:

答案 0 :(得分:2)

implicit operator在这种情况下不能使用,因为它违反了cs0553 user-defined conversion from base class not allowed

您必须创建一个构造函数

public class MyClass : Dictionary<int, string>
{
    public MyClass(Dictionary<int, string> dict)
    {
        foreach(var entry in dict)
        {
            this.Add(entry.Key, entry.Value);
        }
    }
}

然后

MyClass myClass = new MyClass(myList.ToDictionary(l => l.Key, l => l.value));

或创建静态助手以从Dictionary

创建实例

答案 1 :(得分:1)

Enumerable.ToDictionary返回一个Dictionary对象,但是您想分配给一个MyClass。仅仅因为MyClass是派生类型,不允许任何自动转换,所以不允许与MyClass cls = new Dictionary<int, string>()相同。

如果您想要类似的语法,则可以创建自己的扩展方法,例如假设MyClass具有接受字典的构造函数:

public static class EnumerableExtensions
{
    public static MyClass ToMyClass<TSource>(this Enumerable enumerable, Func<TSource,int> keySelector, Func<TSource,string> elementSelector)
    {
        return new Myclass(enumerable.ToDictionary(keySelector, elementSelector));
    }
}

...
MyClass myClass = myList.ToMyClass(l => l.Key, l => l.value);

如果MyClass包含Dictionary而不是对其进行扩展,或者甚至将其转换为完全不同的格式,这也可以使用。

答案 2 :(得分:0)

您也可以通过创建和使用简单方法来做到这一点。试试这个:

public static MyClass ConvertToMyClass(Dictionary<int, string> dictionary)
    {
        MyClass obj = new MyClass();
        foreach (var entry in dictionary)
        {
            obj.Add(entry.Key, entry.Value);
        }
        return obj;
    }

然后,用作

MyClass myClass = Program.ConvertToMyClass(myList.ToDictionary(l => l.Key, l => l.value));