2010-03-08 73 views
1

任何人都可以帮忙吗?c#:IsNullableType助手类?

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

存在的问题是,一些属性在1个模型中使用可空类型和其他它不

真正的DBS应该使用相同的,但他们不..

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

所以在我的代码我这样做

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

,但此行会失败在使用标准“布尔”模式(不能为空),因为是在类型没有财产.value的不可为空

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

有人有这个解决方案吗?

编辑

这是我现在有.....我在可空类型的版本检查的HasValue

公共静态类NullableExtensions { 公共静态牛逼的GetValue(这件T OBJ )其中T:struct { return obj; } public static T GetValue(this Nullable obj)where 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; 
    } 
} 
+0

不是一个很好的合同,你已经到了那里... – Kobi 2010-03-08 11:38:07

+1

感谢大家的意见,但布尔?只是一个例子..我也有很多不同的类型,可以为空或不,即int,int?,DateTime,DateTime? ....我希望soemthing通用 – 2010-03-08 11:48:04

+0

嗨kobi,是的,我知道它不理想....但它的代码,我目前使用...在未来,我会改变它 – 2010-03-08 11:48:34

回答

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(); 
+2

+1灵活性,因为如前所述,bool可能不是唯一的类型。 – 2010-03-08 11:54:13

+0

如果“i”为空,则“i.GetValue()”将失败。但是你可以修改方法body“return obj == null?default(T):obj.Value;” – 2010-03-08 11:54:52

+0

@Hans - 会的。你需要检查空值(尽管这对于OP来说是有问题的),或者返回'default(T)'。这里没有魔法。也许你想在这种情况下发生异常?无论如何,这是一个重要的观点。我看到有人已经问过OP。 – Kobi 2010-03-08 11:56:40

0

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

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

OR

这是你在找什么?

bool? n = false; 
bool nn = true; 

Console.WriteLine(n ?? nn); 
0

一个比较另类:

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

在空的,只有真实不虚,空或假的就是假的。在常规布尔中,真/假是正常的。

+0

不能不转换布尔? to bool – 2010-03-08 11:49:12

+0

@mark - 在任何情况下都适用,不知道你的编译器抱怨什么: -/ – 2010-03-08 12:18:22

0

我可以建议的最好方法是始终将其转换为可为空值,然后使用空合并运算符说出希望该值为空时的值。例如:

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

上述内容将适用于b被定义为bool还是bool?

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); 
0

你可以使用:

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

这应该工作objectContract.IsAvailable是否是boolbool?或任何其他空类型。

对于日期,例如:

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