C# 方法返回SqlConnection或MySqlConnection
我想创建一个方法,该方法基于我正在传递的MySql或MSSQL提供程序,我想返回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
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:我应该更清楚一点——它是一个开关表达式,也意味着您可以将该方法作为一个表达式体成员来实现,这使得整个过程比语句版本更加精简。