C#动态返回类型

时间:2012-03-31 22:13:01

标签: c# .net

我已经解决了我的问题

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

3 个答案:

答案 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。