2010-05-04 49 views
1

我alredy有這樣的:可空<T>作爲參數

public static object GetDBValue(object ObjectEvaluated) 
{ 
    if (ObjectEvaluated == null) 
    return DBNull.Value; 
    else 
    return ObjectEvaluated; 
} 
used like: 

List<SqlParameter> Params = new List<SqlParameter>(); 
Params.Add(new SqlParameter("@EntityType", GetDBValue(EntityType))); 

現在我想保持相同的接口,但延長,爲可空

public static object GetDBValue(int? ObjectEvaluated) 
{ 
    if (ObjectEvaluated.HasValue) 
    return ObjectEvaluated.Value; 
    else 
    return DBNull.Value; 
} 

public static object GetDBValue(DateTime? ObjectEvaluated) 
{...} 

使用它,但我只想要1個功能GetDBValue爲空的。我該怎麼做,保持原樣的電話?這可能嗎?

我可以使它像工作:

public static object GetDBValue<T>(Nullable<T> ObjectEvaluated) where T : struct 
{ 
    if (ObjectEvaluated.HasValue) 
    return ObjectEvaluated.Value; 
    else 
    return DBNull.Value; 
} 

但電話變爲:

Params.Add(new SqlParameter("@EntityID ", GetDBValue<int>(EntityID))); 

回答

3

,你必須是好的,但可以用空更加縮短它的通用版本 - 合併運營商:

public static object GetDBValue<T>(Nullable<T> ObjectEvaluated) 
    where T : struct 
{ 
    return ObjectEvaluated ?? (object)DBNull.Value; 
} 

你可能會缺少的是,你不需要使用泛型pa當你打電話給它時; C#的類型推斷會弄清楚你:

int? x = null; 
object y = GetDBValue(x); 
+0

問題是調用不會GetDBValue(x),但GetDBValue (x)!這就是我的問題的原因,我不想讓n版本的函數保持相同的調用,我認爲這是不可能的,但也許有人... – user331940 2010-05-04 02:29:57

+0

@ferch:不,那不是正確。 C#在泛型上進行類型推斷。該代碼將在方法調用中不帶''進行編譯。它將完全按照這個答案所寫的那樣工作。 – Aaronaught 2010-05-04 14:29:51

+0

對不起Aaronaught,你說的沒錯。我第一次嘗試時遇到了錯誤,並且出現了編譯錯誤。它起到魅力的作用。 我不縮短如果因爲我仍然需要的值不空和不可空。 謝謝 – user331940 2010-05-05 00:00:01

1

如果ENTITYID(在你的最後一個例子)是空類型,則編譯器會知道調用GetDBValue不指定基本類型。

1

我不確定有多少這樣做;你有什麼已經盒(因爲它返回object),你不妨讓CLR爲你做。簡單地說:

public static object GetDBValue(object ObjectEvaluated) 
{ 
    return ObjectEvaluated ?? DBNull.Value; 
} 

沒有太多這裏好處加入泛型(因爲我們不使用T)。

您當然可以可以添加一個通用的方法,但它會添加什麼?