[英]C# Dynamic return type
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;
}
您可以具有通用类。 听起来这是您正在寻找的更多东西。 然后,您可以返回创建类的类型为:
public class MyDatabaseClass<T> where T : DbCommand
{
public virtual T GenerateCommand()
{
//.....
}
}
我使用通用约束来确保T的类型也为DbCommand。
您将'GenerateCommand()'设为void,有两个重载:一个重载,它接收到一个'out MySqlCommand',另一个重载了'输出SqlCommand,然后在函数中进行更改。
void GenerateCommand(out MySqlCommand com)
{
.
.
.
}
void GenerateCommand(out SqlCommand com)
{
.
.
.
}
出: http : //msdn.microsoft.com/zh-cn/library/t3c3bfhx(v=vs.71).aspx
如果要在数据库类型之间移动,则代码应取决于抽象(DbCommand,DbConnection,DbParameter等),而不是具体的实现(SqlConnection,SqlCommand)。 否则,在添加新的数据库提供程序时,您将必须更改所有与数据库相关的代码。 然后,您将为每个提供程序复制所有与数据库相关的代码。
.Net已经有了抽象工厂来创建所有这些与数据库相关的抽象。 它称为DbProviderFactory 。 看起来这就是您要实现的目标:
public virtual DbCommand CreateCommand()
public virtual DbConnection CreateConnection()
.Net具有此工厂的某些内置提供程序特定的实现(SqlClientFactory,OleDbFactory,OdbcFactory)。 在这里,您可以找到如何使用DbProviderFactories。 在这里,您可以找到MySql的DbProviderFactory。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.