在我的项目中,我有一个泛型类,用于存储数据并传递给另一个函数:
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
传递。如何以正确的方式将泛型类传递给函数?任何人都可以建议一种方法来做到这一点没有错误吗?
答案 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
,因为您将只传入一个集合。