代码之家  ›  专栏  ›  技术社区  ›  Tomas Kubes

如何实现泛型对象.toString(cultureinfo.invariant)

  •  1
  • Tomas Kubes  · 技术社区  · 6 年前

    我把这张代码表抄在下面的问题上 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;
    }
    

    我想在具体的十进制符号等方面可能会有类似的问题。

    1 回复  |  直到 6 年前
        1
  •  3
  •   CodeCaster    6 年前

    这段代码已经做了很多事情,难道你不想把它分解成更小的方法吗?

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

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

    当然,还实现了各种空检查和其他改进,但是您得到了一般的想法。另外,如果一个属性又是一个复杂的类型呢?