这纯粹是好奇/挑战,根本没有实际意义。所以我不是在寻找完成工作的替代解决方案。
从这个问题最有效的方法来检查 DBNull 然后分配给一个变量?我发现这个答案看起来像:
oSomeObject.IntMemeber = oRow["Value"] as int? ?? iDefault;
oSomeObject.StringMember = oRow["Name"] as string ?? sDefault;
我可以将上述表达式移动到一个通用函数(或两个,或更多),以便它同时接受两者int?
,string
并且我可以这样称呼它:
oSomeObject.IntMemeber = oRow.Read<int?>("Value", 0); //iDefault is now 0
//or
oSomeObject.IntMemeber = oRow.Read<int>("Value"); //iDefault is now default(int)
//and
oSomeObject.StringMember = oRow.Read<string>("Name"); //sDefault is now default(string)
要求:
1) 在 s 的情况下,我需要一个选项来指定默认值DBNull
。default(T)
如果我没有指定默认值,我还需要一个返回选项。所以这行不通:
public static T Read<T>(this IDataRecord dr, string field, T defaultValue) where T : class
{
return dr[field] as T ?? defaultValue;
}
public static T? Read<T>(this IDataRecord dr, string field, T? defaultValue) where T : struct
{
return dr[field] as T? ?? defaultValue;
}
因为我不能打电话oSomeObject.StringMemeber = oRow.Read<string>("Name")
它不必是可选参数,甚至可以是重载:
public static T Read<T>(this IDataRecord dr, string field) where T : class
{
return dr[field] as T ?? default(T);
}
public static T? Read<T>(this IDataRecord dr, string field) where T : struct
{
return dr[field] as T? ?? default(T?);
}
public static T Read<T>(this IDataRecord dr, string field, T defaultValue) where T : class
{
return dr[field] as T ?? defaultValue;
}
public static T? Read<T>(this IDataRecord dr, string field, T? defaultValue) where T : struct
{
return dr[field] as T? ?? defaultValue;
}
这不会编译,因为方法 1 和 2 具有相同的签名。
2) 泛型函数(在重载的情况下)应该具有相同的名称。
3)as
关键字必须使用检查和强制类型。正如我之前所说,我并不是真的在寻找解决方案来读取IDataRecord
或增强性能或其他东西。
有类似的问题
但这是非常特定于as
关键字的。所以那里的答案不适用。
附录:我知道不会有一个单一的解决方案。我会接受哪个是最优雅的选择。