方法,该方法接受泛型类作为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
传递。如何以正确的方式将泛型类传递给函数?有人能提出一种没有错误的方法吗?
您可以将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
的方法,因为您将只传递一个集合。