方法,该方法接受泛型类作为c#中的参数

本文关键字:方法 参数 泛型类 | 更新日期: 2023-09-27 18:00:17

在我的项目中,我有一个通用类,用于存储数据并传递给另一个函数:

public class SqlCommandParameter<T>
{
    public string ParameterName { get;private set; }
    public SqlDbType SqlDbType { get; private set; }
    public T SqlDbValue { get; private set; }
    public SqlCommandParameter(string parameterName, SqlDbType sqlDbType, T sqlDbValue)
    {
        ParameterName = parameterName;
        SqlDbType = sqlDbType;
        SqlDbValue = sqlDbValue;
    }
}

但当我试图将此实例传递给另一个函数时,它会给出错误:无法解析T。这是我的方法声明:

 public Task<DataTable> GetDataAsync(int? id, string commandTextQuery, CommandType commandType,params SqlCommandParameter<T>[] parameters )
    { ... } 

由于存储过程的一个或多个值不同,所以我将其作为params传递。如何以正确的方式将泛型类传递给函数?有人能提出一种没有错误的方法吗?

方法,该方法接受泛型类作为c#中的参数

您可以将GetDataAsync()设置为通用方法GetDataAsync<T>(),但当您调用方法时,所有参数都将被限制为T

GetDataAsync(..., new SqlCommandParameter<int>(), new SqlCommandParameter<int>());

会起作用,但是

GetDataAsync(..., new SqlCommandParameter<int>(), new SqlCommandParameter<string>());

不会。一种选择是从非泛型SqlCommandParameter派生泛型SqlCommandParameter<T>,并将非泛型传递给非泛型GetDataAsync():

public abstract class SqlCommandParameter
{
    public string ParameterName { get; private set; }
    public SqlDbType SqlDbType { get; private set; }
    protected SqlCommandParameters(string parameterName, SqlDbType sqlDbType)
    {
        ParameterName = parameterName;
        SqlDbType = sqlDbType;
    }
}
public class SqlCommandParameter<T>: SqlCommandParameter
{
    public T SqlDbValue { get; private set; }
    public SqlCommandParameter(string parameterName, SqlDbType sqlDbType, T sqlDbValue): base(parameterName, sqlDbType)
    {
        SqlDbValue = sqlDbValue;
    }
}

有了以上内容,下面的调用将起作用:

GetDataAsync(..., new SqlCommandParameter<int>(), new SqlCommandParameter<string>());

如果方法的签名是

public Task<DataTable> GetDataAsync(
    int? id,
    string commandTextQuery,
    CommandType commandType,
    params SqlCommandParameter[] parameters )  { ... }

另一种解决方案是为泛型参数创建一个容器,并将该容器传递给不带params的方法,因为您将只传递一个集合。