c#:IsNullableType助手类?

时间:2010-03-08 11:32:20

标签: c#

有人可以帮忙吗?

我有一些在两个项目之间共享的代码。代码指向一个模型,该模型基本上是来自db的属性集合。

问题是某些属性在1个模型中使用可空类型而另一个属性不在

真的dbs应该使用相同的但不会... ..

所以例如有一个名为IsAvailble的属性,它在一个模型中使用“bool”而另一个使用bool? (可空类型)

所以在我的代码中我做了以下

 objContract.IsAvailble.Value ? "Yes" : "No"   //notice the property .VALUE as its a bool? (nullable type)

但是对于使用标准“bool”(不可为空)的模型,此行将失败,因为对于不可为空的类型没有属性.VALUE

是否有某种辅助类,我检查属性是否为可空类型,我可以返回.Value ..否则我只返回属性。

有人有解决方案吗?

修改

这就是我现在所拥有的......我正在检查可空类型版本中的HasValue

public static class NullableExtensions     {         public static T GetValue(this T obj)其中T:struct         {             返回obj;         }         public static T GetValue(这个Nullable obj),其中T:struct         {             return obj.Value;         }

    public static T GetValue<T>(this T obj, T defaultValue) where T : struct
    {
        return obj;
    }

    public static T GetValue<T>(this Nullable<T> obj, T defaultValue) where T : struct
    {
        if (obj.HasValue)
            return obj.Value;
        else
            return defaultValue;
    }
}

7 个答案:

答案 0 :(得分:5)

这有点奇怪,但也许你可以在这里使用扩展方法:

static class NullableExtensions
{
    public static T GetValue<T>(this T obj) where T : struct
    {
        return obj;
    }
    public static T GetValue<T>(this Nullable<T> obj) where T : struct
    {
        return obj.Value;
    }
}

他们将使用可空或常规类型:

int? i = 4;
int j = 5;

int a = i.GetValue();
int b = j.GetValue();

答案 1 :(得分:1)

我不会演员。使用??运算符

http://msdn.microsoft.com/en-us/library/ms173224(VS.80).aspx

bool? isAvailble = null;

//string displayIsAvailble = (bool)(isAvailble) ? "Yes" : "No"; //exception Nullable object must have a value.

string displayIsAvailble = (isAvailble ?? false) ? "Yes" : "No";  //outputs "no"

Console.WriteLine(displayIsAvailble);

答案 2 :(得分:0)

(bool)(objContract.IsAvailble) ? "Yes" : "No"

答案 3 :(得分:0)

Convert.ToBoolean(objContract.IsAvailble) ? "yes" : "no"

OR

这是你在找什么?

bool? n = false;
bool nn = true;

Console.WriteLine(n ?? nn); 

答案 4 :(得分:0)

还有一个选择:

objContract.IsAvailble == true ? "Yes" : "No"

在nullable上,只有true为true,null或false为false。在普通布尔上,真/假是正常的。

答案 5 :(得分:0)

最好我可以建议总是强制转换为可空,然后使用null合并运算符来说明当值为null时你想要的值。 e.g:

    string s3 = (bool?)b ?? false ? "yes" : "no";

无论b被定义为bool还是bool,上述都会起作用?

答案 6 :(得分:0)

您可以使用:

bool? b1 = objContract.IsAvailable;
string s1 = b1.Value ? "Yes" : "No";`

无论objectContract.IsAvailablebool还是bool?还是任何其他可以为空的类型,这都应该有效。

例如日期:

DateTime? t1 = objContract.EitherNullableOrNotNullableDate;
string s1 = t1.Value.ToString();