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

标签 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 传递。如何以正确的方式将泛型类传递给函数?谁能建议一种没有错误的方法?

最佳答案

您可以制作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/

相关文章:

c# - 如何编写 C# 方法来返回基于枚举参数的 Func<T> ?

c# - 将通用 T1 转换为对象然后转换为 T2 是不好的做法吗?

generics - 如何在 Rust 的泛型函​​数中同时使用非拥有迭代器和消耗迭代器?

c# - 使用 ConfigurationBuilder 设置基本路径

c# - 如何将 PictureBox.Image 保存到文件?

c# - 如何在 C# 中实现 Excel Solver 功能?

c# - 在 C++ 中注册 .NET COM 事件的处理程序

java - 泛型映射键应该只允许两个类并且值一个类

delphi - 如何将 TObject 转换为 TObjectList<T>?

java - 为什么会出现通用数组创建错误?