2011-07-18 68 views
1

我想拉動數據表對象的值,並動態填充web服務調用的對象,我已經嘗試了一些aproaches但縮小到這,它似乎缺少的是能夠反映目標類型並將數據表中的對象轉換爲一個。C# - 使用反射動態投射

我在這裏撓我的腦袋!

foreach (PropertyInfo pi in zAccount) 
       { 
        object o = row[pi.Name]; 
        if (o.GetType() != typeof(DBNull)) 
        { 
         pi.SetValue(a, o, null); 
        } 
       } 

這使我類型轉換錯誤:類型System.String'的

對象不能被轉換爲類型 'System.Nullable`1 [System.Boolean]'。

因此,理想的情況是這樣的:

foreach (PropertyInfo pi in zAccount) 
       { 
        object o = typeof(pi.GetType())row[pi.Name]; 
        pi.SetValue(a, o, null); 
       } 
+0

「行」的確切類型是什麼? –

+0

DataRow我遍歷一個DataTable對象 – Yoda

+0

無法將字符串強制轉換爲可空,因此這與動態強制轉換無關。 – jbtule

回答

4

這是一段代碼,我用它來完成你正在嘗試做的事情;將類型轉換出數據庫。通常情況下,您可以使用Convert.ChangeType,但這不適用於可爲空的類型,所以此方法處理該情況。

/// <summary> 
/// This wrapper around Convert.ChangeType was done to handle nullable types. 
/// See original authors work here: http://aspalliance.com/852 
/// </summary> 
/// <param name="value">The value to convert.</param> 
/// <param name="conversionType">The type to convert to.</param> 
/// <returns></returns> 
public static object ChangeType(object value, Type conversionType) 
{ 
    if (conversionType == null) 
    { 
    throw new ArgumentNullException("conversionType"); 
    } 
    if (conversionType.IsGenericType && conversionType.GetGenericTypeDefinition().Equals(typeof(Nullable<>))) 
    { 
    if (value == null) 
    { 
     return null; 
    } 
    NullableConverter nullableConverter = new NullableConverter(conversionType); 
    conversionType = nullableConverter.UnderlyingType; 
    } 
    return Convert.ChangeType(value, conversionType); 
} 

你可以這樣使用它像:

foreach (PropertyInfo pi in zAccount) 
{ 
    object o = ChangeType(row[pi.Name], pi.GetType()); 
    pi.SetValue(a, o, null); 
} 

編輯:

其實,重新閱讀您的文章,您的錯誤信息

對象類型'System.String'可以不能轉換爲'System.Nullable`1 [System.Boolean]'類型。

使它看起來像你得到了從數據庫返回的是一個string類型,但是屬性bool?型(可空布爾值)的,因此它不能轉換。

+0

但是您的解決方案仍然可行,不是嗎? –

+0

也許吧。我想這取決於'row [pi.Name]'的實際值是什麼。如果它是一個字符串「true」或「false」,那麼我認爲'Convert.ChangeType'可能會使它成爲一個布爾值。如果是字符串「foo」,那麼它仍然會拋出一些異常。 – CodingWithSpike

+0

看起來像它工作正常。而拋出一個像「foo」這樣的值就沒有問題了(對於bool而言也是可以的)。同樣,當試圖將「foo」分配給「int」時也會出現異常。 +1給我。 –

0

只是猜測,但它可能是你的O是一個字符串(如「假」)和你的財產可能是布爾,因此錯誤。

您可以使用Convert.ChangeType。它可能有幫助

+0

這可能是正確的答案,但你應該提供一個例子。 –

0

這是因爲您的行包含的數據類型與帳戶類的屬性類型不匹配。

爲什麼如此我不知道沒有看到更多的代碼。