Nullable <t>作为参数</t>

时间:2010-05-04 01:25:45

标签: c# generics nullable

我已经有了这个:

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)
 {...}

但我只想要一个函数Ge​​tDBValue用于nullables。我该怎么做并按原样保持通话?这有可能吗?

我可以像以下一样工作:

 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 个答案:

答案 0 :(得分:4)

您拥有的通用版本没问题,尽管您可以使用null合并运算符进一步缩短它:

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

您可能缺少的是在调用时不需要使用泛型参数; C#的类型推断将为您解决:

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

答案 1 :(得分:1)

如果EntityID(在上一个示例中)是Nullable类型,那么编译器将知道调用GetDBValue而不指定基础类型。

答案 2 :(得分:1)

我不确定有多少这样做;您拥有已经的框(因为它返回object),您也可以让CLR为您执行此操作。简单地:

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

此处添加泛型的好处并不多(因为我们不使用T)。

你当然可以添加一个通用方法,但是它添加了什么?