我想为泛型类编写一个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
,对于没有null
但FormatProvider
当然具有功能的对象,它应该返回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