2013年1月14日 星期一

C# - 如何知道泛型的型態? 趴兔

最近在測試 Oracle 的資料庫,
簡單的說就是要把底層改成連到 Oracle 去,
但是又不想 hard code 直接把所有的 SqlConnection 改成 OracleConnection,
然後就想到上次那個泛型的寫法【C# - 如何知道泛型的型態?】,
但是不幸的是...原來上次那個寫法只能用在基本資料型態,
所以我沒有辦法依照上次那樣寫來區分 SqlConnection 跟 OracleConnection,
但是我想應該是有辦法的才對,所以又要找好朋友估狗了!
後來測試出可以用 typeof 的方式寫,
先改涵式的宣告,如下:

private T GetConnection<T>

在程式裡面可以用下面的方式這樣判斷:

if (typeof(T) == typeof(OracleConnection))
if (typeof(T) == typeof(SqlConnection))



用這樣來區分 SqlConnection 跟 OracleConnection,
不過回傳的時候也不可以直接回傳,前面要加上 (T)(Object) ,
程式如下:


string connStr = GetConnectionString<OracleConnection>();
OracleConnection conn = new OracleConnection(connStr);
conn.Open();
return (T)(object)conn;


如果要回傳 null 的時候也是一樣:

return (T)(object)null;

另外發現另外一種用法,就是要組 ConnectString 的時候我是呼叫另一個涵式,
固定回傳字串,但是因為 SQL Server 跟 Oracle 的連線字串不一樣,
所以我也想要他可以依照不同的需求回傳,
以前都呆呆的多加一個變數來判斷,剛剛測試發現用泛型就可以處理了,
宣告如下:

public string GetConnectionString<T>()

然後程式裡面再用前面的判斷方式就可以,
呼叫的程式就會像是這樣。

string connStr = GetConnectionString<OracleConnection>();

突然覺得泛型好好用啊!
但是要會寫有點難ㄟ,台灣的參考資料好少啊~~~
然後...底層要共用還有好多問題要解決喔!囧rz...

沒有留言:

張貼留言