我想将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#输出类似的输出。
答案 0 :(得分:1)
看起来问题是你在对象上调用ToString()
。 List<String>.ToString()
将返回"List<System.String>"
,这是您所看到的,除了URL编码。
您需要:
使用ToQueryString
方法提供iterface:
public interface IQueryStringable
{
string ToQueryString();
}
并将您可能想要用作查询字符串的所有类实现它,或者
重写您的反射,以便迭代序列。像(伪代码)的东西:
IEnumerable
的实例。如果没有,请像以前一样继续"[]="
和该项的值组成的字符串。为了理智,我会推荐选项1,我喜欢玩反射。如果你想允许任意的类嵌套,它会变得更复杂。