使用StringFormat转换为String

时间:2014-07-17 09:49:22

标签: c#

我想为泛型类编写ToString()方法,我可以在其中指定StringFormat。

到目前为止,我有以下代码:

public class Foo<T> : IFoo
{
    public T Value { get; set; }
    string IFoo.Value { get { ValueToString(Value); } }

    public string StringFormat { get; set }

    public Foo(T value, string stringFormat)
    {
        Value = value;
        StringFormat = stringFormat;
    }

    private string ValueToString(T value)
    {
        if (!string.IsNullOrEmpty(StringFormat))
        {
            var formattable = value as IFormattable;
            if (formattable != null)
            {
                var format = CultureInfo.CurrentCulture.GetFormat(typeof(T)) as IFormatProvider;
                if (format != null)
                    return formattable.ToString(StringFormat, format);
            }
        }

        return Convert.ToString(value);
    }
}

public interface IFoo
{
    string Value { get; }
}

我正在调用这样的代码:

public class Bar
{
    public Bar()
    {
        var dateTimeFoo = new Foo<DateTime>(DateTime.Now, "dd.MM.yyyy");
        var iFoo = dateTimeFoo as IFoo;
        if (Convert.ToString(dateTimeFoo.Value) != iFoo.Value)
        {
            //stringformat worked...
        }
    }
}

我当前实现的问题是这行代码:

var format = CultureInfo.CurrentCulture.GetFormat(typeof(T)) as IFormatProvider;

它会返回null,对于没有nullFormatProvider肯定有能力的对象,它应该返回DateTime,我该怎样才能得到正确的FormatProvider通用T的<1}}

4 个答案:

答案 0 :(得分:3)

CultureInfo已经实现了IFormatProvider,您只想做

return formattable.ToString(StringFormat, CulturuInfo.CurrentCulture);

如果你看一下GetFormat方法的实现

public virtual Object GetFormat(Type formatType)
{
    if (formatType == typeof (NumberFormatInfo))
    {
        return (NumberFormat);
    }
    if (formatType == typeof (DateTimeFormatInfo))
    {
        return (DateTimeFormat);
    }
    return (null);
}

你可以看到它只支持两种类型并返回 null ,否则as documented here

答案 1 :(得分:2)

CultureInfo已经是IFormatProvider,我不明白为什么你需要在这里得到特定的部分。

var formattable = value as IFormattable;
if (formattable != null)
{
    //var format = CultureInfo.CurrentCulture.GetFormat(typeof(T)) as IFormatProvider;
    //if (format != null)
        return formattable.ToString(StringFormat, CultureInfo.CurrentCulture);
}

答案 2 :(得分:0)

正如documentation所说:

  

CultureInfo.GetFormat()方法仅支持 NumberFormatInfo 和&gt; DateTimeFormatInfo 类型。

您正在传递DateTime类型,因此该方法会返回null。因此,获取格式的正确方法是:

object format = CultureInfo.CurrentCulture.GetFormat(typeof(DateTimeFormatInfo));

object format = CultureInfo.CurrentCulture.GetFormat(typeof(NumberFormatInfo));

取决于T的类型。

答案 3 :(得分:0)

来自CultureInfo.GetFormat的{​​{3}}

返回值 键入:System.Object

如果formatType是NumberFormatInfo类的Type对象,则为NumberFormat属性的值[...]。

-OR -

DateTimeFormat属性的值,[...],如果formatType是DateTimeFormatInfo类的Type对象。

-OR -

null,如果formatType是任何其他对象。

所以你不能将这个方法用于任意类型。