可以使用可空类型作为通用参数?
我想要做这样的事情:
myYear = record.GetValueOrNull<int?>("myYear"),
注意可空类型作为泛型参数。
由于GetValueOrNull
函数可能返回null,我的第一次尝试是这样的:
public static T GetValueOrNull<T>(this DbDataRecord reader, string columnName)
where T : class
{
object columnValue = reader[columnName];
if (!(columnValue is DBNull))
{
return (T)columnValue;
}
return null;
}
但是我现在得到的错误是:
类型'int?' 必须是引用类型才能在通用类型或方法中将其用作参数'T'
对! Nullable<int>
是一个struct
! 所以我尝试将类约束更改为struct
约束(并且副作用不能再返回null
):
public static T GetValueOrNull<T>(this DbDataRecord reader, string columnName)
where T : struct
现在的任务:
myYear = record.GetValueOrNull<int?>("myYear");
给出以下错误:
类型'int?' 必须是不可为空的值类型才能在通用类型或方法中将其用作参数'T'
尽可能指定一个可为空的类型作为泛型参数?
将返回类型更改为Nullable,然后使用非空参数调用该方法
static void Main(string[] args)
{
int? i = GetValueOrNull<int>(null, string.Empty);
}
public static Nullable<T> GetValueOrNull<T>(DbDataRecord reader, string columnName) where T : struct
{
object columnValue = reader[columnName];
if (!(columnValue is DBNull))
return (T)columnValue;
return null;
}
public static T GetValueOrDefault<T>(this IDataRecord rdr, int index)
{
object val = rdr[index];
if (!(val is DBNull))
return (T)val;
return default(T);
}
就像这样使用它:
decimal? Quantity = rdr.GetValueOrDefault<decimal?>(1);
string Unit = rdr.GetValueOrDefault<string>(2);
只需对原始代码做两件事 - 删除where
约束,并将最后一次return
从return null
return default(T)
到return default(T)
。 这样你可以返回你想要的任何类型。
顺便说一句,您可以避免使用is
通过将if
语句更改为if (columnValue != DBNull.Value)
。