c#:通过泛型使用返回基于T类型的动态sql连接

本文关键字:类型 动态 连接 sql 返回 泛型 | 更新日期: 2023-09-27 18:15:20

假设我正在处理许多SQL连接对象。有些连接我的本地数据库,有些连接我的远程数据库等

public static T GetGenericConnection<T>() 
        {
        }

所以我想调用像GetGenericConnection<DBLocal>() or GetGenericConnection<DBRemote>()这样的函数,然后GetGenericConnection将根据传递值返回sql连接对象作为T。pass值表示类名少如DBLocal or DBRemote

或我将调用函数像GetGenericConnection<ConnectionType.DBLocal>() or GetGenericConnection<ConnectionType.DBRemote>()

ConnectionType.DBLocal是enum类型。

GetGenericConnection函数将根据传递值返回DBLocal or DBRemote实例为T类型。

请告诉我如何用示例代码实现这一点。由于

更新
public static T GetGenericConnection<T>(ConnectionType ConnectionFor)
{
    if (ConnectionFor == ConnectionType.LocalSQLConnection)
        return (T)Convert.ChangeType((new BBASQLLocalConnection()).Connection, typeof(T));
    else if (ConnectionFor == ConnectionType.ORCSWEBSQLConnection)
        return (T)Convert.ChangeType((new BBAORCSSQLConnection()).Connection, typeof(T)); 
    else if (ConnectionFor == ConnectionType.ReportConnection)
        return (T)Convert.ChangeType((new BBASQLReportConnection()).Connection, typeof(T)); 
    else
        return (T)Convert.ChangeType((new BBASAGEConnection()).Connection, typeof(T));
}

当我像这样调用函数时出现了一些问题

SqlConnection conn1 = (SqlConnection) ConnectionManager.Factory.BBADBConnectionFactory.GetGenericConnection<BBASQLLocalConnection>(ConnectionType.LocalSQLConnection);

Error message was

无法转换类型"ConnectionManager"。BBASQLLocalConnection"System.Data.SqlClient.SqlConnection

c#:通过泛型使用返回基于T类型的动态sql连接

对此不需要泛型类型参数。只需一个常规参数即可:

public static IDbConnection GetDatabaseConnection(ConnectionType db) 
{
    switch (db)
    {
        case ConnectionType.DBLocal:
            return new SqlConnection("dblocal connection string here");
            break;
        case ConnectionType.DBRemote:
            return new SqlConnection("db remote connection string here");
            break;
        default:
            throw new InvalidArgumentException("Unrecognized DB Type");
            break;
    }    
}

好吧,根据你的更新,我看到更多你的问题是什么;您有用于连接类型的包装器对象。我在这里建议的仍然是正确的方法。问题编辑的变化是,您还需要确保您的特殊连接包装器类型都实现一个公共接口。