我已经有了这个:
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)
{...}
但我只想要一个函数GetDBValue用于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)));
答案 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
)。
你当然可以添加一个通用方法,但是它添加了什么?