2009-09-21 63 views
2

我有一個擴展方法,我想重載,以便它可以處理引用類型和可爲空值類型。但是,當我嘗試這樣做時,我會得到「具有相同簽名的會員已被聲明。」 C#不能在我的泛型方法中使用where限定符來區分它們嗎?做這項工作的一個顯而易見的方法是給每個方法一個獨特的名字,但這對我來說似乎不是一個非常優雅的解決方案。做這項工作的最佳方式是什麼?重載一種方法來支持引用類型和可爲空類型

實施例:

public static T Coalesce<T>(this SqlDataReader reader, string property) where T : class 
{ 
    return reader.IsDBNull(reader.GetOrdinal(property)) 
       ? null 
       : (T) reader[property]; 
} 

public static T? Coalesce<T>(this SqlDataReader reader, string property) where T : struct 
{ 
    return reader.IsDBNull(reader.GetOrdinal(property)) 
       ? null 
       : (T?)reader[property]; 
} 

// Usage 
var id = reader.Coalesce<System.Guid?>("OptionalID"); 

回答

7

這適用於SqlDataReader.Item[string]屬性類型是object

public static T Coalesce<T>(this SqlDataReader reader, string property) 
{ 
    return reader.IsDBNull(reader.GetOrdinal(property)) 
       ? default(T) 
       : (T) reader[property]; 
} 
+0

完美!爲ObviousThingsIMissed團隊評分一分。 :) –

+0

我實際上已經刪除了這篇文章,從思考轉換會導致編譯問題開始 - 但稍後才意識到,只要Item屬性類型是對象就會覆蓋它。 :○ –

2

由於@280Z28指出的那樣,在你的情況,你可以用一個方法處理這兩種情況。但是,如果您真的想要兩個具有相同簽名但基於傳入類型的內部不同的方法,那在C#中是不可能的。

Differences Between C++ Templates and C# Generics MSDN上:

  • C#不支持明確的分工;也就是特定類型的模板的自定義實現。
  • C#不支持局部特化:對於類型參數的子集的自定義實現。
相關問題