重载方法以支持引用类型和可空类型

时间:2009-09-21 18:11:48

标签: c# generics extension-methods nullable

我有一个扩展方法,我想重载,所以它可以处理引用类型和可空值的类型。但是,当我尝试这样做时,我得到“已经宣布具有相同签名的成员”。 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");

2 个答案:

答案 0 :(得分: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];
}

答案 1 :(得分:2)

正如@280Z28指出的那样,在您的情况下,您可以使用一种方法处理这两种情况。但是,如果您真的想要两个具有相同签名但基于传入类型的内部不同的方法,那么在C#中是不可能的。

来自MSDN上的Differences Between C++ Templates and C# Generics

  
      
  • C#不支持显式专业化;也就是说,特定类型的模板的自定义实现。
  •   
  • C#不支持部分特化:类型参数子集的自定义实现。
  •