这是我经常遇到的一个案例,我想知道是否有人有更简洁的方法来做这件事。
假设我有一个变量'x',它是一个可以为空的类型。例如:string,int?或DateTime?
我想用x做一些事情,我需要将x格式化为字符串,但我不能在x上调用.ToString()或其他方法,因为x可能为null。
是的,我可以做类似
的事情if(x == null)
{
Console.WriteLine("empty");
}
else
{
Console.WriteLine(x.ToString("G"));
}
或
Console.WriteLine("{0}", x == null? "empty" : x.ToString("G"));
但我正在寻找更短的东西。也许什么都不存在,但我想我会问并开始谈话。
我对此感兴趣的一个原因是因为我经常有大量的变量,我将数据从一个类移动到另一个类或类似的东西,我需要应用一些格式。
所以不是只有x,我有一个,b,c,... z,我必须检查每个是否为空并对每个应用格式,它们是varios类型,需要不同的格式。复制和粘贴更短更容易,只需对每行进行微小的更改就可以了。
所有人都有任何巧妙的技巧吗?
我也考虑过??运营商,但我似乎找不到任何好方法来应用它。乍一看,似乎它只是针对这种情况设计的,但实际上并没有帮助。
只要您不需要应用任何格式,它才真正有用。
答案 0 :(得分:2)
编写包装器方法
public static string MyToString(MyType? x, string emptyString, string format)
{
if (x == null)
{
return emptyString;
}
else
{
return ((MyType)x).ToString(format);
}
}
答案 1 :(得分:2)
通用助手:
public static class NullableHelper
{
public static string ToString<T>(this T? x, string format) where T: struct
{
return x.HasValue ? string.Format(format, x.Value) : null;
}
}
用法:
int? i = 1;
i.ToString("{0:000}");
答案 2 :(得分:1)
对于可以为空的类型,您可以尝试:
int? i;
i= null;
i.HasValue ? i.ToString() : "empty"
答案 3 :(得分:1)
public static void Main(string[] args)
{
int? a = null;
string b = "my string";
object c = null;
// prints empty
Console.WriteLine(a.MyToString());
// prints my string
Console.WriteLine(b.MyToString());
// prints empty
Console.WriteLine(c.MyToString());
// prints variable a doesn't have a value either
Console.WriteLine(c.MyToString(callback: () => !a.HasValue ? "variable a doesn't have a value either" : DecoratorExtensions.MY_DEFAULT));
}
public static class DecoratorExtensions
{
public const string MY_DEFAULT = "empty";
public static string MyToString<T>(this T obj, string myDefault = MY_DEFAULT, Func<string> callback = null) where T : class
{
if (obj != null) return obj.ToString();
return callback != null ? callback() : myDefault;
}
public static string MyToString<T>(this T? nullable, string myDefault = MY_DEFAULT, Func<string> callback = null) where T : struct
{
if (nullable.HasValue) return nullable.Value.ToString();
return callback != null ? callback() : myDefault;
}
}