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

时间:2015-06-29 16:39:41

标签: c# generics

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

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传递。如何以正确的方式将泛型类传递给函数?任何人都可以建议一种方法来做到这一点没有错误吗?

1 个答案:

答案 0 :(得分:4)

您可以将GetDataAsync()作为通用方法GetDataAsync<T>(),但所有参数将仅限于调用方法时遇到的T:< / p>

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

会奏效,但

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

不会。一种选择是从非通用SqlCommandParameter<T>派生您的通用SqlCommandParameter,并将非泛型传递给非通用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,因为您将只传入一个集合。