我想这样做:
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>是一个结构体!所以我尝试将类约束改为结构约束(作为副作用不能再返回null):
public static T GetValueOrNull<T>(this DbDataRecord reader, string columnName)
where T : struct
现在是作业:
myYear = record.GetValueOrNull<int?>("myYear");
给出以下错误:
类型'int?'必须是一个非空值类型,以便在泛型类型或方法中使用它作为参数'T'
是否可以将可空类型指定为泛型参数?
我知道这很老了,但这里有另一个解决方案:
public static bool GetValueOrDefault<T>(this SqlDataReader Reader, string ColumnName, out T Result)
{
try
{
object ColumnValue = Reader[ColumnName];
Result = (ColumnValue!=null && ColumnValue != DBNull.Value) ? (T)ColumnValue : default(T);
return ColumnValue!=null && ColumnValue != DBNull.Value;
}
catch
{
// Possibly an invalid cast?
return false;
}
}
现在,你不关心T是值类型还是引用类型。只有当函数返回true时,您才能从数据库中得到一个合理的值。
用法:
...
decimal Quantity;
if (rdr.GetValueOrDefault<decimal>("YourColumnName", out Quantity))
{
// Do something with Quantity
}
这种方法与int非常相似。TryParse("123", out MyInt);
我知道这很老了,但这里有另一个解决方案:
public static bool GetValueOrDefault<T>(this SqlDataReader Reader, string ColumnName, out T Result)
{
try
{
object ColumnValue = Reader[ColumnName];
Result = (ColumnValue!=null && ColumnValue != DBNull.Value) ? (T)ColumnValue : default(T);
return ColumnValue!=null && ColumnValue != DBNull.Value;
}
catch
{
// Possibly an invalid cast?
return false;
}
}
现在,你不关心T是值类型还是引用类型。只有当函数返回true时,您才能从数据库中得到一个合理的值。
用法:
...
decimal Quantity;
if (rdr.GetValueOrDefault<decimal>("YourColumnName", out Quantity))
{
// Do something with Quantity
}
这种方法与int非常相似。TryParse("123", out MyInt);