public virtual T GenerateCommand()
{
Type typeParameterType = typeof(T);
if (typeParameterType == typeof(SqlCommand))
{
//SqlCommand
}
else if (typeParameterType == typeof(MySqlCommand))
{
//MySqlCommand
}
return new T()
{
};
}
我正在构建一个生成查询/命令的类,当在类的字段中定义数据库的类型时,该类能够生成各种DbCommands(MsSqlServer& MySql)。如何返回正确的类型?
我试过了:
public virtual DbCommand GenerateCommand()
{
//.....
}
但我总是需要转换返回值:
MySqlCommand s = this.GenerateCommand() as MySqlCommand;
我也试过这个:
public virtual T GenerateCommand<T>()
{
//.....
}
但这不是我想要的,因为我无法创建DbCommand的实例,所以我什么都不能返回。
T会基于我班级的存储类型吗?
编辑: 泛型类的使用至少抛出两个例外:
if (T is MySqlCommand)
{
return new MySqlCommand();
}
else
{
return new SqlCommand();
}
'T'是'类型参数',但用作'变量'
无法将类型'MySql.Data.MySqlClient.MySqlCommand'隐式转换为'T'
(T)MySqlCommand()
也不起作用
编辑2: 我可以这样做吗?
public virtual T GenerateCommand(SqlDatabaseKind dbKind)
{
T = (dbKind == SqlDatabaseKind.MicrosoftSqlServer) ? SqlCommand :
MySqlCommand;
}
答案 0 :(得分:3)
您可以拥有通用类。听起来这更像是你在寻找的东西。然后,您只需返回创建类的类型:
public class MyDatabaseClass<T> where T : DbCommand
{
public virtual T GenerateCommand()
{
//.....
}
}
我使用generic constraint来确保T的类型为DbCommand。
答案 1 :(得分:1)
将'GenerateCommand()'设为void,有两个重载: 一个接收'out MySqlCommand',另一个接收'out SqlCommand',并更改函数。
void GenerateCommand(out MySqlCommand com)
{
.
.
.
}
void GenerateCommand(out SqlCommand com)
{
.
.
.
}
out:http://msdn.microsoft.com/en-us/library/t3c3bfhx(v=vs.71).aspx
答案 2 :(得分:0)
如果要在数据库类型之间移动,那么您的代码应该依赖于抽象(DbCommand,DbConnection,DbParameter等)而不是具体实现(SqlConnection,SqlCommand)。否则,在添加新数据库提供程序时,您必须更改所有与数据库相关的代码。并且您将为每个提供者复制所有与数据库相关的代码。
.Net已经有了抽象工厂来创建所有这些与数据库相关的抽象。它被称为DbProviderFactory。看起来就像你要实现的那样:
public virtual DbCommand CreateCommand()
public virtual DbConnection CreateConnection()
.Net有一些内置的特定于提供程序的工厂实现(SqlClientFactory,OleDbFactory,OdbcFactory)。 Here您可以找到如何使用DbProviderFactories。 here你可以找到MySql的DbProviderFactory。