IReadOnlyDictionary协方差不足如何解决?我正在尝试公开一个只读字典,其中包含具有只读接口的对象。在内部,字典是可写的,其中的对象也是可写的(请参见下面的示例代码)。我的问题是IReadOnlyDictionary不支持协变转换,原因在此处的问题中列出。这意味着我不能将我的内部字典公开为只读字典。所以我的问题是,是否有一种有效的方法可以将我的内部字典转换为IReadOnlyDictionary,或者其他一些处理它的方法?我能想到的方案是:保留两个内部词典并保持同步。访问属性并转换其中的所有对象时创建新字典。在内部使用时将IReadOnly变回NotReadOnly。1似乎很痛苦,2似乎效率很低。3目前听起来是最有前途的,但仍然很丑陋。我还有其他选择吗?publicclassExposesReadOnly{privateDictionaryInternalDict{get;放;}publicIReadOnlyDictionaryPublicList{get{//这不起作用...returnthis.InternalDict;}}//这个类可以在内部修改,但我不想//暴露这个功能。私有类NotReadOnly:IReadOnly{publicstringName{get;放;}}}publicinterfaceIReadOnly{字符串名称{get;您可以为字典编写自己的只读包,例如:publicclassReadOnlyDictionaryWrapper:IReadOnlyDictionarywhereTValue:TReadOnlyValue{privateIDictionary_dictionary;publicReadOnlyDictionaryWrapper(IDictionarydictionary){if(dictionary==null)thrownewArgumentNullException("dictionary");}_dictionary=字典;}publicboolContainsKey(TKeykey){return_dictionary.ContainsKey(key);}publicIEnumerableKeys{get{return_dictionary.Keys;}}publicboolTryGetValue(TKeykey,outTReadOnlyValuevalue){TValuev;var结果=_dictionary.TryGet值(键,输出v);值=v;返回结果;}publicIEnumerableValues{get{return_dictionary.Values.Cast();}}publicTReadOnlyValuethis[TKeykey]{get{return_dictionary[key];}publicintCount{get{return_dictionary.Count;}}publicIEnumerator>GetEnumerator(){return_dictionary.Select(x=>newKeyValuePair(x.Key,x.Value)).GetEnumerator();}System.Collections.IEnumeratorSystem.Collections.IEnumerable.GetEnumerator(){返回this.GetEnumerator();我建议您可能希望使用协变访问方法以及创建只读包装对象的方法来定义自己的协变接口,该对象以所需的类型实现IDictionary或IReadonlyDictionary只需忽略接口中的IEnumerable>。根据你在做什么,定义IFetchByKey可能会有所帮助,它由IFetchByKeyinheritance、IFetchByKeyinheritance组成,前者接受对任何类型对象的查询(给定一个对象实例,Cat集合应该能够说出它是否包含那个实例,即使它是A类型Dog或ToyotaPrius;该集合将不包含后一种类型的任何实例,并且应该能够这样说)。也许这个解决方案适合你:publicclassExposesReadOnly{privateIDictionaryInternalDict{get;放;}publicIReadOnlyDictionaryPublicList{get{IReadOnlyDictionarydictionary=newReadOnlyDictionary(InternalDict);返回字典;}}私有类NotReadOnly:IReadOnlyName{publicget;放;}}publicvoidAddSomeValue(){InternalDict=newDictionary();InternalDict.Add(1,newNotReadOnly(){Name="SomeValue"});}}publicinterfaceIReadOnly{字符串名称{get;}}classProgram{staticvoidMain(string[]args){ExposesReadOnlyexposesReadOnly=newExposesReadOnly();exposesReadOnly.AddSomeValue();Console.WriteLine(exposesReadOnly.PublicList[1].Name);控制台.ReadLine();只读。PublicList[1].Name="这是不可能的!";}}希望这可以帮助!恭喜另一种解决特定协方差不足的方法:解决特定类型在字典上的有用协方差问题intermediate=toWrap.ToDictionary(a=>a.Key,a=>a.Value!=null?a.Value.ToArray().AsEnumerable():null);varwrapper=newReadOnlyDictionary>(intermediate);返回包装器;}}根据你的用例,你可以通过将Funcpublic来逃避上面的内容如果分享的内容对你有用,你需要了解更多C#学习教程,希望你多多关注——publicclassExposesReadOnly{privateDictionaryInternalDict{get;放;}publicFuncPublicDictionaryAccess{get{return(x)=>this.InternalDict[x];}}//这个类可以在内部修改,但我不想//暴露这个功能。私有类NotReadOnly:IReadOnly{publicstringName{get;放;}}}publicinterfaceIReadOnly{字符串名称{get;}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
