说我有以下类定义:
public class MyClass : Dictionary<int, string>
{
}
如何从类似这样的表达式中创建一个(不起作用)?
MyClass myClass = myList.ToDictionary(l => l.Key, l => l.value);
答案 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));