传递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#得到类似的输出
看起来问题是你在对象上调用ToString()
。List<String>.ToString()
将返回"List<System.String>"
,这就是您所看到的,除了URL编码。
你需要:
-
提供一个带有
ToQueryString
方法的接口:public interface IQueryStringable { string ToQueryString(); }
,并有所有类你可能想使用的查询字符串实现它,或
-
重写反射,使其迭代序列。类似于(伪代码):
- 得到财产。
- 查看它是否是
IEnumerable
的实例。如果没有,按前面的 继续。否则 - :
- 为每个项构造一个字符串,由属性名、
"[]="
和该项的值组成。 - 连接生成的字符串并对其进行urlencode。
为了理智起见,我推荐选项1,我喜欢玩反思。如果您想允许任意嵌套类,则会变得更复杂。