通用列表或不同类型的字典

Mat*_*lay 20 c#

我想要一个将字符串映射到不同类型的通用列表的Dictionary.即以下列形式:

Key        Value
string     List<T>
string     List<U>
string     List<V>
string     List<U>
...

目前我正在使用a Dictionary<string, IList>然后从每个字典KeyValuePair<string, IList> pair条目中提取强类型列表,如下所示:

Type layerType = pair.Value.GetType().GetGenericArguments()[0];
List<layerType> objectsClicked = pair.Value as List<layerType>;
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来做到这一点?

[编辑]正如已经注意到的,上面的内容没有编译,道歉 - 这就是当你在做某些事情的时候提出问题时所得到的.更多解释.我正在制作一个基本的空间数据查看器.最终视图由一组Layer<T>s组成.每个图层都提供一个委托来呈现其类型(给定偏移量和比例)以及检查其对象在当前窗口中的方式.对于命中测试,我希望每个图层的列表都被击中了对象.这份名单将是List<Point>一个Point层,等等......从所有命中的分组Layer<T>s就那么是强类型列表的集合.

Ada*_*kis 43

Dictionary<string, dynamic>假设你在C#4上怎么样?

Dictionary<string, dynamic> Dict = new Dictionary<string, dynamic>();
Dict.Add("int", new List<int>());
Dict.Add("string", new List<string>());

Dict["int"].Add(12);
Dict["string"].Add("str");

foreach (KeyValuePair<string, dynamic> pair in Dict) {
   Type T = pair.Value.GetType();
   Console.WriteLine(T.GetGenericArguments()[0].ToString());
}
Run Code Online (Sandbox Code Playgroud)

打印出来

System.Int32

System.String

这就是你要找的东西吗?

  • 是的,你*可以*用Dictionary <string,object>来做,但是你必须每次*访问你的词典内部的东西时进行演员*以便操纵列表.很多人靠动态语言谋生,我不认为在情况需要的时候偶尔会在C#中使用动态类型.我认为一些语言纯粹主义者需要冷静下来 (10认同)
  • 动态服务不仅仅是"酷因素".它允许鸭子打字,"expando"对象和简化的反射.如果你再一次做出贬低的评论,我会在你之后发送Eric Lippert ...... (10认同)
  • 我认为他的词典<string,IList>要好得多.不要把他和动态混为一谈. (4认同)
  • 平反!:-D (2认同)