在c#中将匿名类型转换为键/值数组?

Chr*_*ken 75 .net c# anonymous-types httpwebrequest

我有以下匿名类型:

new {data1 = "test1", data2 = "sam", data3 = "bob"}
Run Code Online (Sandbox Code Playgroud)

我需要一个方法来接受它,并在数组或字典中输出键值对.

我的目标是在HttpRequest中将其用作后期数据,因此我最终将连接到以下字符串中:

"data1=test1&data2=sam&data3=bob"
Run Code Online (Sandbox Code Playgroud)

kbr*_*ton 114

这需要一点点反思才能完成.

var a = new { data1 = "test1", data2 = "sam", data3 = "bob" };
var type = a.GetType();
var props = type.GetProperties();
var pairs = props.Select(x => x.Name + "=" + x.GetValue(a, null)).ToArray();
var result = string.Join("&", pairs);
Run Code Online (Sandbox Code Playgroud)

  • 我们得到了这个......我们可以把它变成一个单行:`var dict = a.GetType().GetProperties().ToDictionary(x => x.Name,x => x.GetValue(a,null)) ;` (27认同)
  • var dict = props.ToDictionary(x => x.Name,x => x.GetValue(a_source,null)) (7认同)

GWB*_*GWB 61

如果您使用的是.NET 3.5 SP1或.NET 4,则可以(ab)使用RouteValueDictionary它.它实现IDictionary<string, object>并具有一个构造函数,该object属性接受属性并将其转换为键值对.

然后循环键和值来构建查询字符串将是微不足道的.

  • 除了取决于您的代码库,它将强制依赖System.Web,否则可能不需要.希望这个类更通用化,并且位于不同的命名空间中. (5认同)
  • 我说"滥用"因为该类最初是为路由而设计的(至少它的名称和名称空间意味着这个).但是,它不包含特定于路由的功能,并且已用于其他功能(例如,在ASP.NET MVC`HtmlHelper`扩展方法中将匿名对象转换为HTML属性的字典. (4认同)

小智 25

以下是他们如何在RouteValueDictionary中执行此操作:

  private void AddValues(object values)
    {
        if (values != null)
        {
            foreach (PropertyDescriptor descriptor in TypeDescriptor.GetProperties(values))
            {
                object obj2 = descriptor.GetValue(values);
                this.Add(descriptor.Name, obj2);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

完整资料来源:http: //pastebin.com/c1gQpBMG


Xym*_*nek 5

有一个将匿名对象转换为字典的内置方法:

HtmlHelper.AnonymousObjectToHtmlAttributes(yourObj)
Run Code Online (Sandbox Code Playgroud)

它也返回RouteValueDictionary。注意它是静态的