在我的方法中,我想处理可以为空的整数值。
public String FormatValue(Int32? item)
{
if (item.HasValue==false) return "";
return item.Value.ToString("### ### ###");
}
我们不想写这个方法的Int32?
,Int64?
和其他版本,所以我们想重构它来处理泛型类型参数:
public String FormatValue<T>(T item)
{
if (item.HasValue==false) return ""; // ERROR: no .HasValue property
return item.Value.ToString("### ### ###"); // ERROR: usually has no ToString() with string argument
}
我该如何处理这种情况?我试图使用"where T"
子句,但没有任何成功。
答案 0 :(得分:5)
首先:
public String FormatValue<T>(Nullable<T> item)
where T : struct, IFormattable
{
if (item.HasValue==false) return "";
return item.Value.ToString("### ### ###", null /* you format provider */ );
}
您正在传递通用T
作为参数,但您需要Nullable
。
其次:
ToString()
中的Nullable
已经在做您需要的事情 - 您不必手动执行此操作(以防万一,您不必格式化):
int? a = null;
Console.WriteLine(a.ToString()); // outputs "", no any exception
答案 1 :(得分:2)
尝试将方法的参数定义为Nullable<T>
:
public String FormatValue<T>(Nullable<T> item) where T : struct
{
return item.HasValue ? item.Value.ToString("### ### ###") : String.Empty;
}
答案 2 :(得分:2)
由于您只希望自己的方法适用于可空类型,因此将T?
作为参数而不是T
似乎没有问题。然后,您可以约束T
:它必须实现基本整数类型实现的IFormattable
。
public string FormatValue<T>(T? item) where T : struct, IFormattable
{
if (item == null) return "";
return item.Value.ToString("### ### ###", null);
}
答案 3 :(得分:1)
使用IFormattable
可能是最好的主意,但您也可以使用string.Format
:
public string FormatValue<T>(T? item) where T : struct
{
return string.Format("{0:### ### ###}", item);
}