c# – 从IDictionary到通用IDictionary的最佳方式
发布时间:2020-12-15 06:44:27 所属栏目:百科 来源:网络整理
导读:我有一个IDictionary字段,我想通过类型为IDictionary string,dynamic的属性公开转换是非常困难的,因为我不知道我可以.Cast()的IDictionary到. 我有最好的 IDictionary properties;protected virtual IDictionarystring,dynamic Properties { get { return _p
我有一个IDictionary字段,我想通过类型为IDictionary< string,dynamic>的属性公开转换是非常困难的,因为我不知道我可以.Cast<>()的IDictionary到.
我有最好的 IDictionary properties; protected virtual IDictionary<string,dynamic> Properties { get { return _properties.Keys.Cast<string>() .ToDictionary(name=>name,name=> _properties[name] as dynamic); } } 解决方法
如果IDictionary的底层类型不实现IDictionary< string,dynamic>,则不能转换对象(period).如果是这样,一个简单的转换(IDictionary< string,dynamic>)localVar就足够了.
如果不是,你可以做两件事情: >将IDictionary复制到通用类型. 编辑:您刚刚发布的示例代码将在每次调用时复制字典!稍后我会用一些建议的代码再次编辑. 选项1 您的示例代码方法是复制数据的一种手段,但副本应该被缓存,或者你将要复制很多次.我建议您将实际的翻译代码放在一个单独的方法中,并在首次使用时将其从属性中调用.例如: private IDictionary dataLayerProperties; private IDictionary<string,dynamic> translatedProperties = null; protected virtual IDictionary<string,dynamic> Properties { if(translatedProperties == null) { translatedProperties = TranslateDictionary(dataLayerProperties); } return translatedProperties; } public IDictionary<string,dynamic> TranslateDictionary(IDictionary values) { return values.Keys.Cast<string>().ToDictionary(key=>key,key => values[key] as dynamic); } 现在,这种方法有明显的缺点吗?如果需要刷新dataLayerProperties怎么办?你必须将translateProperties设置为null等等. 选项2 这是我的首选方法. public class TranslatedDictionary : IDictionary<string,dynamic> { private IDictionary Original = null; public TranslatedDictionary(IDictionary original) { Original = original; } public ICollection<string> Keys { get { return Original.Keys.Cast<string>().ToList(); } } public dynamic this[string key] { get { return Original[key] as dynamic; } set { Original[key] = value; } } // and so forth,for each method of IDictionary<string,dynamic> } //elsewhere,using your original property and field names: Properties = new TranslatedDictionary(properties); 现在,这个方法也有明显的缺点,最令人瞩目的是,Keys(和Value)和其他任何在IDictionary上返回ICollection的东西都必须为每个调用返回一个新的数组,但这仍然允许最灵活的方法,因为它确保数据始终是最新的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |