【问题标题】:Converting a KeyValuePair collection in to anonymous type将 KeyValuePair 集合转换为匿名类型
【发布时间】:2011-01-13 21:38:30
【问题描述】:

是否可以将 KeyValuePair 的 IEnumerable<KeyValuePair<string,string>> 转换为匿名类型?

Dictionary<string, string> dict= new Dictionary<string, string>();
dict.add("first", "hello");
dict.add("second", "world");

var anonType = new{dict.Keys[0] = dict[0], dict.Keys[1] = dict[1]};

Console.WriteLine(anonType.first);
Console.WriteLine(anonType.second);

********************output*****************
hello
world

我想这样做的原因是因为我正在从 web 服务中检索一个对象,该对象表示 wsdl 中不存在的对象。返回的对象仅包含一个包含自定义字段及其值的 KeyValuePair 集合。这些自定义字段可以命名为任何名称,因此我无法真正将 xml 反序列化方法映射到我将使用的最终对象(其属性必须绑定到网格)。

*仅仅因为我使用了Dictionary&lt;string,string&gt;并不意味着它绝对是一本字典,我只是用它来说明。真的是IEnumerable&lt;KeyValuePair&lt;string,string&gt;&gt;

我一直在尝试一种方法来做到这一点,但我正在画一个空白。这是 c# .NET 4.0。

【问题讨论】:

  • 你想要动态类型,而不是匿名类型。所以你应该看看 C# 4 的 dynamic 特性。
  • 您是说 (a) 您不知道“第一”或“第二”是否真的存在,它们可能是任何东西,但 (b) 您希望能够编码 @ 987654326@ 和 anonType.second?

标签: c# .net


【解决方案1】:

您可以使用ExpandoObject,它基于字典。

【讨论】:

  • 使用动态类型。匿名类型是不同的。
  • @CodeInChaos OP 希望能够编写anonType.firstanonType.second。这看起来像一个动态对象,而不是匿名对象。
  • 嗯,你是对的。错误的术语让我失望了。看起来他真的想要动态输入。
  • @CodeInChaous 标题确实说匿名类型,但语法显然是动态类型。由于他指定了 .NET 4,因此动态似乎是实现语法的最佳途径。
  • @Mike 为什么你宁愿使用反射而不是动态?
【解决方案2】:

我认为有很多方法可以实现这一点,但实际上在同一个字典中转换似乎有点奇怪。

通过不实际转换所有内容来实现此目的的一种方法如下:

public class MyDictionary<T,K> : Dictionary<string,string> // T and K is your own type
{
    public override bool TryGetValue(T key, out K value)
    {
        string theValue = null;
        // magic conversion of T to a string here
        base.TryGetValue(theConvertedOfjectOfTypeT, out theValue);
        // Do some magic conversion here to make it a K, instead of a string here
        return theConvertedObjectOfTypeK;
    }
}

【讨论】:

    【解决方案3】:

    ExpandoObject 是最好的选择,我相信它是一些 XML 的包装器。您也可以使用 XElement:

    var result = new XElement("root");
    result.Add(new XElement("first", "hello"));
    result.Add(new XElement("second", "world"));
    
    Console.WriteLine(result.Element("first").Value); 
    Console.WriteLine(result.Element("second").Value);
    
    foreach (var element in result.Elements())
        Console.WriteLine(element.Name + ": " + element.Value);
    

    我没有使用过 ExpandoObject,所以我会先尝试一下,因为我知道它完全符合您的要求,而且也是新的和有趣的学习内容。

    【讨论】:

      猜你喜欢
      • 2012-01-23
      • 2012-06-26
      • 1970-01-01
      • 2012-05-01
      • 2020-04-18
      • 2012-01-20
      • 1970-01-01
      • 2010-11-27
      相关资源
      最近更新 更多