泛型返回类型和不可为空的对象
本文关键字:对象 返回类型 泛型 | 更新日期: 2023-09-27 18:35:41
我有一个Sql Utility类,其中包含许多围绕SQL查询的方便方法。此类包含以下方法:
public static T ExecuteScalar<T>(
string query,
SqlConnection connection,
params SqlParameter[] parameters)
where T : class, new()
{
SqlCommand command =
CreateCommand(query, connection, parameters);
return command.ExecuteScalar() as T;
}
是否可以返回例如Guid
对象或其他不可为空的类。
像这样:
Guid result =
SqlUtils.ExecuteScalar<Guid>(
@"SELECT [Id] FROM [dbo].[MyTable]
WHERE [Column1] = @Param1",
connection,
new SqlParameter("@Param1", "someValue"));
您可以使用
default(T)
(并且应删除泛型类型约束):
SqlCommand command =
CreateCommand(query, connection, parameters);
object value = command.ExecuteScalar();
if (value == null || value is DbNull)
{
return default(T)'
}
return (T)value;
不是你写它的方式。如果强制转换失败,as
运算符可能会返回null
,因此T
必须是引用类型。
对于值类型,需要使用传统的强制转换运算符(T)
。您还需要删除T
是方法定义的引用类型的约束。
public static T ExecuteScalar<T>(string query,
SqlConnection connection,
params SqlParameter[] parameters)
{
SqlCommand command = CreateCommand(query, connection, parameters);
var result = command.ExecuteScalar();
if (result is T) return (T)result;
return default(T);
}
由于此方法的约束返回类类型,因此您可以返回与类类型(非基元)匹配的任何对象。不过,鉴于您的方法的性质,我认为不需要约束。您应该能够删除此约束并返回可以生成的任何类型。