Flurl(Fluent Url)自定义序列化

问题描述:

当序列化对象以查询字符串值时,如何覆盖Flurl的默认行为?例如。下面的代码Flurl(Fluent Url)自定义序列化

DateTime date = new DateTime(2017, 1, 2, 3, 4, 5); 
Url url = "http://domain.com".SetQueryParam("date", date); 

产生以下网址:

http://domain.com?date=01%2F02%2F2017%2003%3A04%3A05 

我想是这样的:

http://domain.com?date=2017-01-02T03%3A04%3A05.0000000 

这将是如下序列化日期的结果:

date.ToString("O") 

Flurl小心o f URL编码,但除此之外并不关心自定义字符串格式。我想最明显的方式做你想做的是这样的:

"http://domain.com".SetQueryParam("date", date.ToString("O")); 

如果你这样做了很多,并希望避免每次都指定格式位,你可以添加自己的扩展方法(一个用于Url和一个用于string,每pattern):

public static Url SetDateParam(this Url url, string name, DateTime date) 
{ 
    return url.SetQueryParam(name, date.ToString("O")); 
} 

public static Url SetDateParam(this string url, string name, DateTime date) 
{ 
    return new Url(url).SetDateParam(name, date); 
} 

那么你已经有了:

"http://domain.com".SetDateParam("date", date); 
+0

感谢@Tod,这是一个耻辱Flurl不允许定义小号各种类型的序列化规则。更令人讨厌的是,日期序列化甚至不尊重线程的当前文化,并被硬编码为m/d/y。为什么不是规范的y-m-d格式,这正是我试图实现的目标?如果我将查询字符串中的日期发送到正在运行的服务器上。澳大利亚的区域设置,它会尝试将其解释为d/m/y,并且我的一半日期会出错。现在我决定不使用Flurl并编写我自己的查询字符串构建器... – Andrew

+1

@Andrew我在这里以几个方面质疑您的判断。首先,我根本不觉得这个功能根本不存在,至今没有人提出要求。在抱怨之前,您是否考虑在GitHub上记录建议或提交PR?其次,我提出了两个非常简单,直接的解决方案,用Flurl来做你想要的。如果你阅读并理解他们,并且仍然认为放弃它并编写自己的建筑师是你的最佳选择,那么恐怕我不会遵循你的思维过程。 –

+0

@@ Todd对不起,我没有意识到你是Flurl的作者,可能会亲自发表我的评论。我并不是批评这个组件,我认为这很棒,我有所有的意图去使用它,直到我发现这种行为。你提出的解决方案不适合我。你说你“不要按照我的思维过程”,但你不知道我的确切要求。坦率地说,当您决定将日期序列化硬编码为m/d/y而不是使用明确的y-m-d时,我也不会遵循您的思考过程。你能解释一下吗? – Andrew