如何设置Nullable对象的格式?

时间:2013-05-14 21:31:52

标签: c#

这是我经常遇到的一个案例,我想知道是否有人有更简洁的方法来做这件事。

假设我有一个变量'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类型,需要不同的格式。复制和粘贴更短更容易,只需对每行进行微小的更改就可以了。

所有人都有任何巧妙的技巧吗?

我也考虑过??运营商,但我似乎找不到任何好方法来应用它。乍一看,似乎它只是针对这种情况设计的,但实际上并没有帮助。

只要您不需要应用任何格式,它才真正有用。

4 个答案:

答案 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;
    }
}