如何实现泛型对象.ToString(CultureInfo.Invariant).



我在这里复制了这个代码形式的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);
}

当然,实施各种空检查和其他改进,但你会得到大致的想法。另外,如果属性反过来是复杂类型怎么办?

最新更新