我想编写一个将int
和decimal
格式化为字符串
我有这段代码:
我想将其重写为泛型:
public static string FormatAsIntWithCommaSeperator(int value)
{
if (value == 0 || (value > -1 && value < 1))
return "0";
return String.Format("{0:#,###,###}", value);
}
public static string FormatAsDecimalWithCommaSeperator(decimal value)
{
return String.Format("{0:#,###,###.##}", value);
}
public static string FormatWithCommaSeperator<T>(T value) where T : struct
{
string formattedString = string.Empty;
if (typeof(T) == typeof(int))
{
if ((int)value == 0 || (value > -1 && value < 1))
return "0";
formattedString = String.Format("{0:#,###,###}", value);
}
//some code...
}
/// <summary>
/// If the number is an int - returned format is without decimal digits
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public static string FormatNumberTwoDecimalDigitOrInt(decimal value)
{
return (value == (int)value) ? FormatAsIntWithCommaSeperator(Convert.ToInt32(value)) : FormatAsDecimalWithCommaSeperator(value);
}
我如何在函数体中使用T?
我应该使用什么语法?
答案 0 :(得分:34)
您可以使用TypeCode进行切换:
switch (Type.GetTypeCode(typeof(T)))
{
case TypeCode.Int32:
break;
case TypeCode.Decimal:
break;
}
答案 1 :(得分:15)
启用通用的另一种方法是:
switch (typeof(T))
{
case Type intType when intType == typeof(int):
...
case Type decimalType when decimalType == typeof(decimal):
...
default:
...
}
答案 2 :(得分:7)
在现代C#中:
public static string FormatWithCommaSeperator<T>(T value) where T : struct
{
switch (value)
{
case int i:
return $"integer {i}";
case double d:
return $"double {d}";
}
}
答案 3 :(得分:4)
DoFormat(int value)
{
}
DoFormat(double value)
{
}
如果你坚持使用泛型:
switch (value.GetType().Name)
{
case "Int32":
break;
case "Double":
break;
default:
break;
}
或强>
if (value is int)
{
int iValue = (int)(object)value;
}
else if (value is double)
{
double dValue = (double)(object)value;
}
else
{
}
答案 4 :(得分:3)
我有一个类似的问题,但使用自定义类而不是内置数据类型。我是这样处理的:
switch (typeof(T).Name)
{
case nameof(Int32):
break;
case nameof(Decimal):
break;
}
我对其进行了修改以使用您正在使用的类型(即整数和十进制)。与硬编码字符串相比,我更喜欢这种方法,因为类名的重构不会破坏这段代码。
使用较新版本的 C#,您有时也可以这样做:
switch (Activator.CreateInstance(typeof(T)))
{
case int _:
break;
case decimal _:
break;
}
我说“有时”是因为那只适用于具有默认构造函数的类型。这种方法使用模式匹配和丢弃。我不太喜欢它,因为您需要创建对象的一个实例(然后将其丢弃)并且因为默认构造函数要求。
答案 5 :(得分:2)
打开泛型的更格式化的方法是:
switch (true)
{
case true when typeof(T) == typeof(int):
...
case true when typeof(T) == typeof(decimal):
...
default:
...
}
答案 6 :(得分:1)
您可以代替使用泛型使用IConvertible
public static string FormatWithCommaSeperator(IConvertible value) { IConvertible convertable = value as IConvertible; if(value is int) { int iValue = convertable.ToInt32(null); //Return with format. } ..... }
答案 7 :(得分:0)
或者你可以随时做:
public static string FormatWithCommaSeparator<T>(T[] items)
{
var itemArray = items.Select(i => i.ToString());
return string.Join(", ", itemArray);
}
答案 8 :(得分:0)
您可以检查变量的类型;
public static string FormatWithCommaSeperator<T>(T value)
{
if (value is int)
{
// Do your int formatting here
}
else if (value is decimal)
{
// Do your decimal formatting here
}
return "Parameter 'value' is not an integer or decimal"; // Or throw an exception of some kind?
}