2012-02-06 152 views
2

我知道標題很混亂,所以我會試着更好地解釋。這裏的基本上是我想的方法裏面做:將參考圖元轉換爲泛型

if (record["id"] != DBNull.Value) _id = Convert.ToInt32(record["id"]); 
else id = -1; 

我想這對多種類型的,我已經保存在我的數據庫。 (所以如果它是一個字符串,它將其轉換爲一個字符串等等)。任何方式做到這一點都很好,我試圖用一種方法來做到這一點。我有這麼遠,但C#不會自動將int轉換爲對象。想法?

private void Load(ref object var, object obj, object def) 
    { 
     if (var is int) 
     { 
      var = Convert.ToInt32(obj); 
     } 
    } 

    int _id; 
    Load(ref _id, record["id"], -1); 

只是爲了澄清,我的錯誤是「不能從ref int轉換爲ref對象」。 感謝您的幫助。

回答

3

您可以使用Convert.ChangeType(),使你的方法一般:

private void Load<T, U>(out T value, U obj, T defaultValue) 
{ 
    if (obj is DBNull) 
     value = defaultValue; 
    else 
     value = (T)Convert.ChangeType(obj, typeof(T)); 
} 

現在你可以使用它像這樣(簡化的例子,不知道你需要什麼def爲):

int id; 
object foo = 42; 
Load(out id, foo, 1); 
+0

這仍然給了我同樣的錯誤,因爲參數類型不匹配。 – mrK 2012-02-06 18:25:20

+0

另外,def只是一個默認值。 – mrK 2012-02-06 18:29:24

+0

好的,如果foo == DBNull.Value會發生什麼? – mrK 2012-02-06 18:32:16

1

第一關閉,var是C#3.0及更高版本(VS 2008及更高版本)中的保留字。

更重要的是,我會嘗試將其設置爲通用;這樣一來,你的方法能發現真正的類型,你傳遞的變量,並與他們逐案工作,好像他們是強類型:

private void Load<TVar, TSet>(ref TVar var, TSet obj, TVar def) 
{ 
    //this is a little heavy-handed, but in pretty much any situation where 
    //this can fail, you just want the basic type. 
    try 
    { 
     if (var is IConvertible && obj is IConvertible) 
      var = (TVar)Convert.ChangeType(obj, typeof(TVar)); 
     else 
      var = (TVar)obj; //there may just be an explicit operator 
    } 
    catch(Exception) 
    { 
     var = def; //defined as the same type so they are always assignable 
    } 
}