我在这里复制了这个代码形式的StackOverlow问题,但我得到的反馈是它不适用于具有特定日期时间格式的计算机。您知道如何优雅地修复它吗?
问题是格式化方法是通用的和对象的。ToString 没有重载与 CultureInfo 参数。
private string UrlEncodeObject(object o)
{
var properties = from p in o.GetType().GetProperties()
where p.GetValue(o, null) != null
select p.Name + "=" + System.Net.WebUtility.UrlEncode(p.GetValue(o, null).ToString());
string queryString = String.Join("&", properties.ToArray());
return queryString;
}
我希望特定的十进制符号等可能存在类似的问题。
该代码已经做了很多事情,难道你不想将该方法分解为更小的方法吗?
您可以提取一个方法来获取字符串值:
select p.Name + "=" + GetPropertyValue(o, p);
并像这样实现它:
private string GetPropertyValue(PropertyInfo i, object o)
{
var propertyValue = p.GetValue(o, null);
string stringValue;
if (propertyValue.GetType() == typeof(DateTime))
{
stringValue = ((DateTime)propertyValue).ToString(SomeCultureInfo);
}
else
{
stringValue = propertyValue.ToString();
}
return System.Net.WebUtility.UrlEncode(stringValue);
}
当然,实施各种空检查和其他改进,但你会得到大致的想法。另外,如果属性反过来是复杂类型怎么办?