泛型返回类型和不可为空的对象

本文关键字:对象 返回类型 泛型 | 更新日期: 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);
}

由于此方法的约束返回类类型,因此您可以返回与类类型(非基元)匹配的任何对象。不过,鉴于您的方法的性质,我认为不需要约束。您应该能够删除此约束并返回可以生成的任何类型。