c# – 从IDictionary到通用IDictionary的最佳方式

前端之家收集整理的这篇文章主要介绍了c# – 从IDictionary到通用IDictionary的最佳方式前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个IDictionary字段,我想通过类型为IDictionary< string,dynamic>的属性公开转换是非常困难的,因为我不知道我可以.Cast<>()的IDictionary到.

我有最好的

  1. IDictionary properties;
  2. protected virtual IDictionary<string,dynamic> Properties {
  3. get {
  4. return _properties.Keys.Cast<string>()
  5. .ToDictionary(name=>name,name=> _properties[name] as dynamic);
  6. }
  7. }

解决方法

如果IDictionary的底层类型不实现IDictionary< string,dynamic>,则不能转换对象(period).如果是这样,一个简单的转换(IDictionary< string,dynamic>)localVar就足够了.

如果不是,你可以做两件事情:

>将IDictionary复制到通用类型.
>构建一个接受IDictionary作为依赖项的Adapter类,并实现所需的通用IDictionary,将调用从一个映射到另一个.

编辑:您刚刚发布的示例代码将在每次调用时复制字典!稍后我会用一些建议的代码再次编辑.

选项1

您的示例代码方法是复制数据的一种手段,但副本应该被缓存,或者你将要复制很多次.我建议您将实际的翻译代码放在一个单独的方法中,并在首次使用时将其从属性调用.例如:

  1. private IDictionary dataLayerProperties;
  2. private IDictionary<string,dynamic> translatedProperties = null;
  3. protected virtual IDictionary<string,dynamic> Properties
  4. {
  5. if(translatedProperties == null)
  6. {
  7. translatedProperties = TranslateDictionary(dataLayerProperties);
  8. }
  9. return translatedProperties;
  10. }
  11.  
  12. public IDictionary<string,dynamic> TranslateDictionary(IDictionary values)
  13. {
  14. return values.Keys.Cast<string>().ToDictionary(key=>key,key => values[key] as dynamic);
  15. }

现在,这种方法有明显的缺点吗?如果需要刷新dataLayerProperties怎么办?你必须将translateProperties设置为null等等.

选项2

这是我的首选方法.

  1. public class TranslatedDictionary : IDictionary<string,dynamic>
  2. {
  3. private IDictionary Original = null;
  4.  
  5. public TranslatedDictionary(IDictionary original)
  6. {
  7. Original = original;
  8. }
  9. public ICollection<string> Keys
  10. {
  11. get
  12. {
  13. return Original.Keys.Cast<string>().ToList();
  14. }
  15. }
  16.  
  17. public dynamic this[string key]
  18. {
  19. get
  20. {
  21. return Original[key] as dynamic;
  22. }
  23. set
  24. {
  25. Original[key] = value;
  26. }
  27. }
  28. // and so forth,for each method of IDictionary<string,dynamic>
  29. }
  30.  
  31. //elsewhere,using your original property and field names:
  32. Properties = new TranslatedDictionary(properties);

现在,这个方法也有明显的缺点,最令人瞩目的是,Keys(和Value)和其他任何在IDictionary上返回ICollection的东西都必须为每个调用返回一个新的数组,但这仍然允许最灵活的方法,因为它确保数据始终是最新的.

猜你在找的C#相关文章