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