C#:按通用用法返回基于T类型的动态sql连接

时间:2016-10-28 13:27:03

标签: c#

假设我正在使用许多sql连接对象。一些连接我的本地数据库,一些连接我的远程数据库等

public static T GetGenericConnection<T>() 
        {

        }

所以我想调用类似GetGenericConnection<DBLocal>() or GetGenericConnection<DBRemote>()的函数,然后GetGenericConnection将基于传递值将sql连接对象作为T返回。传递值意味着很少有类名DBLocal or DBRemote

或者我会调用类似GetGenericConnection<ConnectionType.DBLocal>() or GetGenericConnection<ConnectionType.DBRemote>()的函数。

ConnectionType.DBLocal是枚举类型。

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);

错误讯息是

  

无法转换类型&#39; ConnectionManager.BBASQLLocalConnection&#39;至   &#39; System.Data.SqlClient.SqlConnection

1 个答案:

答案 0 :(得分:1)

您不需要通用类型参数。只需一个常规参数即可:

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;
    }    
}

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