我想为泛型类编写一个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

最佳答案

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

10-07 17:31