繁体   English   中英

C#动态返回类型

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM