代码之家  ›  专栏  ›  技术社区  ›  Sprintstar

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

c#
  •  0
  • Sprintstar  · 技术社区  · 6 年前

    假设我有以下类定义:

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

    我怎样才能从这样的表达式中创建一个表达式(它不起作用)?

    MyClass myClass = myList.ToDictionary(l => l.Key, l => l.value);
    
    3 回复  |  直到 6 年前
        1
  •  2
  •   Antoine V    6 年前

    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

        2
  •  1
  •   Fire Lancer    6 年前

    Enumerable.ToDictionary 返回A Dictionary 对象,但要分配给 MyClass . 只是因为 类名 是派生类型,不允许任何自动转换,与 MyClass cls = new Dictionary<int, string>() 是不允许的。

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

    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);
    

    如果 类名 包含一个 词典 而不是将其扩展,或者将其转换为完全不同的格式。

        3
  •  0
  •   ksdev    6 年前

    您也可以通过创建和使用简单的方法来实现。试试这个:

    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));