Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 方法返回SqlConnection或MySqlConnection_C#_.net_.net Core - Fatal编程技术网

C# 方法返回SqlConnection或MySqlConnection

C# 方法返回SqlConnection或MySqlConnection,c#,.net,.net-core,C#,.net,.net Core,我想创建一个方法,该方法基于我正在传递的MySql或MSSQL提供程序,我想返回SqlConnection或MySqlConnection 基本上是这样的: public Connection GetConnection(provider) { switch (provider) { case MSSQL: return new SqlConnection(connectionString); case MySql: retu

我想创建一个方法,该方法基于我正在传递的MySql或MSSQL提供程序,我想返回SqlConnection或MySqlConnection

基本上是这样的:

public Connection GetConnection(provider) {

   switch (provider) {
      case MSSQL:
         return new SqlConnection(connectionString);
      case MySql:
          return new MySqlConnection(connectionString);
      default:
          return null;
}
public DbConnection GetConnection(string provider) => 
    provider switch
    {
        MSSQL => new SqlConnection(connectionString),
        MySql => new MySqlConnection(connectionString),
        _ => throw new ArgumentException("Unknown provider", nameof(provider))
    };
因为它们是不同的类型,所以我考虑创建一个抽象类,比如

public abstract class BaseSqlConnection
{
    public abstract void Open();
}

public class MSSQLServerConnection : BaseSqlConnection
{
    public MSSQLServerConnection(SqlConnection connection)
    {
        Connection = connection;
    }

    public SqlConnection Connection { get; set; }

    public override void Open()
    {
        Connection.Open();
    }
}

问题是这还不够,因为我还需要实现CreateCommand()等方法和其他我可能需要的方法,所以我想问一下,是否有人有更简单的解决方案。

由于这两个对象都继承自同一基类,您可以这样做:

public DbConnection GetConnection(provider) {

   switch (provider) {
      case MSSQL:
         return new SqlConnection(connectionString);
      case MySql:
          return new MySqlConnection(connectionString);
      default:
          return null;
}
注意:您可能需要使用System.Data.Common添加

编辑:

结合Jon的建议,应该是这样的:

public Connection GetConnection(provider) {

   switch (provider) {
      case MSSQL:
         return new SqlConnection(connectionString);
      case MySql:
          return new MySqlConnection(connectionString);
      default:
          return null;
}
public DbConnection GetConnection(string provider) => 
    provider switch
    {
        MSSQL => new SqlConnection(connectionString),
        MySql => new MySqlConnection(connectionString),
        _ => throw new ArgumentException("Unknown provider", nameof(provider))
    };

您需要指定抽象类中的每个方法并将其实现到DBMS类中,如果在两台服务器上都能工作,那么您可以重用的只是查询本身,它们不是都继承自
System.Data.Common.DbConnection
?@DavidG yes,因此,我可以只返回一个DbConnection或基本接口,但是如果我没有弄错的话,MySql有一些特定的属性,而这些属性是dbProviderFactory以这种方式提供的。注意,对于C#8开关表达式,这可能更简单。我个人建议为未知的提供者抛出一个
ArgumentException
,而不是返回null。是的,我还添加了ArgumentException,它有意义,tooThanks@JonSkeet,也添加了您的建议。我建议将此问题和答案转换为更通用的用例:“如何返回两种不同的类型?”(或其他)并首先询问“它们是否共享一个共同的祖先或接口?”并以这个用例为例(我没有发现它进行快速搜索)因此,它可以作为后续问题的副本。@DavidG:我应该更清楚一点——它是一个开关表达式,也意味着您可以将该方法作为一个表达式体成员来实现,这使得整个过程比语句版本更加精简。