2010-03-08 68 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();