将c#对象作为查询字符串传递

时间:2016-08-16 18:33:59

标签: c# .net linq c#-4.0 query-string

我想将C#对象作为查询字符串&我使用以下代码来获得所需的结果。

 class Program
    {
        public static string GetQueryString(object obj)
        {
            var properties = from p in obj.GetType().GetProperties()
                             where p.GetValue(obj, null) != null
                             select p.Name + "=" + HttpUtility.UrlEncode(p.GetValue(obj, null).ToString());

            return String.Join("&", properties.ToArray());
        }
        static void Main(string[] args)
        {
            Filters fil = new Filters();
            fil.Age = 10;
            fil.Id = "some id";

            fil.Divisions = new List<string>();
            fil.Divisions.Add("div 1");
            fil.Divisions.Add("div 2");
            fil.Divisions.Add("div 3");

            fil.Names = new List<string>();
            fil.Names.Add("name 1");
            fil.Names.Add("name 2");
            fil.Names.Add("name 3");

            var queryStr = GetQueryString(fil);
            Console.ReadKey();
        }



    }

    public class Filters
    {
        public List<string> Names { get; set; }
        public List<string> Divisions { get; set; }
        public int Age { get; set; }
        public string Id { get; set; }
    }

使用上面的代码给出了以下结果:

Names=System.Collections.Generic.List%601%5bSystem.String%5d&Divisions=System.Collections.Generic.List%601%5bSystem.String%5d&Age=10&Id=some+id

输出不是有效的查询字符串。我需要帮助将任何POCO类转换为查询字符串格式。

我有一个类似的JavaScript对象,我可以将其转换为正确的查询字符串。

{
  "id":"some id",
  "age":10,
  "division":["div 1","div 2","div 3"],
  "names":["name 1","name 2","name 3"]
}

使用Jquery我可以说$.param(obj),这将导致:

"id=some+id&age=10&division%5B%5D=div+1&division%5B%5D=div+2&division%5B%5D=div+3&names%5B%5D=name+1&names%5B%5D=name+2&names%5B%5D=name+3"

我想用c#输出类似的输出。

1 个答案:

答案 0 :(得分:1)

看起来问题是你在对象上调用ToString()List<String>.ToString()将返回"List<System.String>",这是您所看到的,除了URL编码。

您需要:

  1. 使用ToQueryString方法提供iterface:

    public interface IQueryStringable
    {
        string ToQueryString();
    }
    

    并将您可能想要用作查询字符串的所有类实现它,或者

  2. 重写您的反射,以便迭代序列。像(伪代码)的东西:

    1. 获取财产。
    2. 查看它是否是IEnumerable的实例。如果没有,请像以前一样继续
    3. 否则:
    4. 对于每个项目,构造一个由属性名称"[]="和该项的值组成的字符串。
    5. 连接生成的字符串并对其进行urlencode。
  3. 为了理智,我会推荐选项1,我喜欢玩反射。如果你想允许任意的类嵌套,它会变得更复杂。