在我的项目中,我有一个泛型类,用于存储数据并传递给另一个函数:
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<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
因为您将只传递那个集合。
关于c# - C# 中接受泛型类作为参数的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31121045/