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

时间:2018-12-21 15:22:48

标签: c# cultureinfo

我复制了这段代码,形式为StackOverlow问题here,但是我得到的反馈是它不适用于具有特定日期时间格式的计算机。您是否知道如何优雅地进行修复?

问题在于格式化方法是通用的并且是对象。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;
}

我希望特定的十进制符号等可能存在类似的问题。

1 个答案:

答案 0 :(得分:3)

该代码已经在做很多事情,您不是要将该方法分解为较小的方法吗?

您可以提取一种方法来获取字符串值:

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);
}

当然可以实现各种null检查和其他改进,但是您可以理解。另外,如果属性反过来又是复杂类型怎么办?