C#将通用列表添加到字典

时间:2018-07-18 16:50:39

标签: c# generics

所以我遇到了C#中的通用列表问题,例如:

var foo = new Dictionary<long, List<object>>();
foo.Add(123, new List<string>());

给出错误:Cannot convert from System.Collections.Generic.List<string> to System.Collections.Generic.List<object>

可以正常使用的地方:

var foo = new Dictionary<long, object>();
foo.Add(123, new string());

我的实际用例如下:

var foo = new Dictionary<long, List<ISomeInterface>>();
foo.Add(123, new List<SomeClassA>());
foo.Add(345, new List<SomeClassB>());

其中SomeClassA和SomeClassB都实现ISomeInterface。这可能吗?

我的想法是,我可以从字典中获取ISomeInterface的列表,然后迭代该列表,该列表调用ISomeInterface上定义的SomeMethod。

3 个答案:

答案 0 :(得分:0)

对于您的实际用例:

您需要将列表声明为List<ISomeInterface>,然后用实现该接口的对象填充它。

var foo = new Dictionary<long, List<ISomeInterface>>();
foo.Add(123, new List<ISomeInterface>());
foo[123].Add(new SomeObjectThatImplementsISomeInterface());

其他方法是先创建列表,然后将其添加到字典中。

var bar = new List<ISomeInterface>();
bar.add(new SomeObjectThatImplementsISomeInterface());
bar.add(new SomeOtherObjectThatImplementsISomeInterface());
var foo = new Dictionary<long, List<ISomeInterface>>();
foo.Add(123, bar);

当然,当您从foo取回值时,您将得到它们为ISomeInterface,并且如果需要了解此类对象的具体类型,则需要进行反思。

答案 1 :(得分:0)

您可以使用ToList将类强制转换为通用类型接口,如

using System.Collections.Generic;
using System.Linq;

namespace ConsoleApp9
{
    class Program
    {
        static void Main(string[] args)
        {
            Dictionary<int, List<ISomething>> dictionary
                = new Dictionary<int, List<ISomething>>();

            var list = new List<Something>() { new Something() };
            dictionary.Add(1, list.ToList<ISomething>());
        }

        public interface ISomething
        {
        }

        public class Something : ISomething
        {
        }
    }
}

答案 2 :(得分:0)

您可以使用System.Linq解决它:

var foo = new Dictionary<long, List<object>>();
foo.Add(123, new List<string>().ToList<object>());

类似地

var foo = new Dictionary<long, List<ISomeInterface>>();
foo.Add(123, new List<SomeObject>().ToList<ISomeInterface>());

另一种可能性:

foo.Add(123, new List<ISomeInterface>(new List<SomeObject>()));