我想为泛型类编写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
的<1}}
答案 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是任何其他对象。
所以你不能将这个方法用于任意类型。