所以我遇到了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。
答案 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>()));