簡體   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