Nullable<T> 作为参数

use*_*940 2 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)));
Run Code Online (Sandbox Code Playgroud)

现在我想保留相同的接口,但扩展它以将其与可为空的一起使用

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

 public static object GetDBValue(DateTime? ObjectEvaluated)
 {...}
Run Code Online (Sandbox Code Playgroud)

但我只想要 1 个函数 GetDBValue 用于空值。我该如何做到这一点并保持通话原样?这可能吗?

我可以让它像这样工作:

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

但调用更改为:

Params.Add(new SqlParameter("@EntityID ", GetDBValue<int>(EntityID)));
Run Code Online (Sandbox Code Playgroud)

Aar*_*ght 5

您拥有的通用版本很好,尽管您可以使用空合并运算符进一步缩短它:

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

您可能会错过的是,在调用它时不需要使用泛型参数;C# 的类型推断将为您解决这个问题:

int? x = null;
object y = GetDBValue(x);
Run Code Online (Sandbox Code Playgroud)