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

本文关键字:查询 字符串 对象 传递 | 更新日期: 2023-09-27 18:02:35

我想传递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#得到类似的输出

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

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

你需要:

  1. 提供一个带有ToQueryString方法的接口:

    public interface IQueryStringable
    {
        string ToQueryString();
    }
    

    ,并有所有类你可能想使用的查询字符串实现它,或

  2. 重写反射,使其迭代序列。类似于(伪代码):

    1. 得到财产。
    2. 查看它是否是IEnumerable的实例。如果没有,按前面的
    3. 继续。否则
    4. :
    5. 为每个项构造一个字符串,由属性名、"[]="和该项的值组成。
    6. 连接生成的字符串并对其进行urlencode。

为了理智起见,我推荐选项1,我喜欢玩反思。如果您想允许任意嵌套类,则会变得更复杂。