【问题标题】:How to implement generic object.ToString(CultureInfo.Invariant)如何实现泛型 object.ToString(CultureInfo.Invariant)
【发布时间】:2019-05-22 01:37:57
【问题描述】:

我从 StackOverlow 问题 here 复制此代码,但我收到反馈说它不适用于具有特定日期时间格式的计算机。你知道如何优雅地修复它吗?

问题是格式化方法是泛型的,object.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;
}

我预计特定的十进制符号等可能会有类似的问题。

【问题讨论】:

  • 您能否检查p 的类型,如果是DateTime(或DateTime? 可能),然后将其转换为在该属性上使用.ToString() 的重载?
  • 为什么不将泛型类型传递给函数并将对象转换为它?

标签: c# cultureinfo


【解决方案1】:

那个代码已经做了很多事情了,你不想把那个方法分解成更小的方法吗?

你可以提取一个方法来获取字符串值:

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

当然还要实现各种空值检查和其他改进,但您大致了解。另外,如果属性又是复杂类型怎么办?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多