将动态对象转换为NameValueCollection

gma*_*che 3 c# asp.net-mvc winforms

如何将动态转换为NameValueCollection?

我尝试将其转换为字典,然后转换为NameValueCollection,但它将为不同类型抛出异常.

[...]
  NameValueCollection item = ((IDictionary<string, object>)dynamicObject).ToNameValueCollection();
[...]

public static NameValueCollection ToNameValueCollection<TKey, TValue>(this IDictionary<TKey, TValue> dictionary)
{
  var nameValueCollection = new NameValueCollection();
  foreach (var pair in dictionary)
  {
    string value = pair.Value == null ? null : value = pair.Value.ToString();
    nameValueCollection.Add(pair.Key.ToString(), value);
  }
  return nameValueCollection;
}
Run Code Online (Sandbox Code Playgroud)

gma*_*che 6

我找到了答案:

using System.ComponentModel;
using System.Collections.Generic;
using System.Collections.Specialized;

public static class Extensions
{
  public static NameValueCollection ToNameValueCollection<T>(this T dynamicObject)
  {
    var nameValueCollection = new NameValueCollection();
    foreach (PropertyDescriptor propertyDescriptor in TypeDescriptor.GetProperties(dynamicObject))
    {
      string value = propertyDescriptor.GetValue(dynamicObject).ToString();
      nameValueCollection.Add(propertyDescriptor.Name, value);
    }
    return nameValueCollection;
  }
}
Run Code Online (Sandbox Code Playgroud)

要使用它:

public void DoStuff(dynamic obj) 
{
  NameValueCollection items = obj.ToNameValueCollection();
  // Do stuff with items
}
Run Code Online (Sandbox Code Playgroud)