gpt4 book ai didi

c# - 从 IDictionary 转换为通用 IDictionary 的最佳方式

转载 作者:可可西里 更新时间:2023-11-01 08:26:38 25 4
gpt4 key购买 nike

我有一个 IDictionary 字段,我想通过 IDictionary<string, dynamic> 类型的属性公开它转换非常困难,因为我不知道我能做什么 .Cast<>() IDictionary to.

最好的我有:

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> ,您不能转换对象,时期。如果是,通过 (IDictionary<string, dynamic>)localVar 进行简单转换就足够了。

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

  1. 复制 IDictionary到您的通用类型。
  2. 构建一个 Adapter接受 IDictionary 的类作为依赖项并实现通用 IDictionary你想要的,将调用从一个映射到另一个。

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

选项 1

您的示例代码方法作为一种复制数据的方法是可靠的,但副本应该被缓存,否则您将要复制很多次。我建议您将实际的翻译代码放入一个单独的方法中,并在第一次使用时从您的属性(property)中调用它。例如:

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 怎么办?您必须再次将 translatedProperties 设置为 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 和任何在 ICollection 上返回 IDictionary 的东西都必须为每次调用返回一个新数组。但这仍然允许最灵活的方法,因为它确保数据始终是最新的。

关于c# - 从 IDictionary 转换为通用 IDictionary 的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2962011/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com