泛型列表或不同类型的字典我想要一个将字符串映射到不同类型的泛型列表的字典。即以下列:CoreValuesstringListstringListstringListstringList...目前我正在使用字典,然后从每个字典中提取强类型列表KeyValuePair对条目,如下所示:TypelayerType=pair.Value。GetType().GetGenericArguments()[0];ListobjectsClicked=pair.ValueasList;有一个更好的方法吗?[编辑]如前所述,上面没有编译,抱歉-这就是你在做某事时提出问题时得到的结果。更多解释。我正在制作一个基本的空间数据查看器。最终视图由一组图层组成。每个层都提供一个委托来呈现其类型(给定偏移量和比例)和检查当前窗口中有哪些对象的方法。对于命中测试,我希望每一层的列表都被命中。该列表将是一个点层列表,依此类推...来自所有层的命中分组将是强类型列表的集合。假设您正在使用C#4如何使用DictionaryDictionaryDictionaryDict=newDictionary();Dict.Add("int",newList());Dict.Add("string",newList());字典["int"].Add(12);词典[“字符串”].Add(“字符串”);foreach(KeyValuePairpairinDict){TypeT=pair.Value.GetType();Console.WriteLine(T.GetGenericArguments()[0].ToString());}打印出System.Int32System.String这是你要找的吗?使用字典可能只是解决方案。但是你的代码是错误的,你不能使用这样的泛型。您不能像这样创建动态类型。你需要的东西的普遍问题是它与C#等强类型语言不兼容。在强类型语言中,您必须知道哪些类型是完全类型化的。但这不能通过正常方法来完成。你对泛型的理解也是错误的。它只是该类型的编译时扩展。一般想法:在您的情况下,使用您保留在这些列表中的某种类型的OOP层次结构。那将是更好、更安全的想法,并且不会让每个看你的代码的人都抓狂。我会在Euphoric和Adam之间采取中间立场,你应该利用IList和dynamic。这是我认为更正确的:vardict=newDictionary();dict.Add("u",newList());dict.Add("v",newList());//如果你知道成员存在于IListdict["u"].Add(newU());字典["v"].Add(新V());//如果您知道要返回什么,在这种情况下您应该将varuProperty=(dict["u"][0]asU).UPropertyvarvProperty=(dict["v"][0]asV).VProperty//如果你不确定(dict[someKey]asdynamic)[someIndex].SomeMember...;这一切都比依赖反射要简单得多。基本思想是将字典值类型声明为IList以使您的意图更清晰,同时利用动态来减轻反射怪异并使您的代码更短。我实际上认为更简洁的方法是在字典周围创建一个包装器:publicclassGlobalStore{privatereadonlyIDictionary_globalStore;publicGlobalStore(){_globalStore=newConcurrentDictionary();}publicIEnumerableGetFromCache()whereT:class{return(IEnumerable)_globalStore[typeof(T)];}publicvoidSetCache(IEnumerablecache)whereT:class{_globalStore[typeof(T)]=cache;下面是对它的测试:以上是C#学习教程:通用列表或不同类型词典分享的所有内容,如果对你有用,需要进一步了解C#学习教程,希望你多加注意——[TestClass]publicclassGlobalStoreTest{[TestMethod]publicvoidGlobalStore_Test(){//排列varglobalStore=newGlobalStore();globalStore.SetCache(newList{newClientModel{ClientId=1,ClientName="Client1"},newClientModel{ClientId=2,ClientName="Client2"}});//Actvarclients=globalStore.GetFromCache();//断言Assert.AreEqual(2,clients.Count());}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
