2016-07-28 35 views
2

我寫代碼,一個對象轉換到另一個使用反射...可空屬性複製到一個非空的版本使用反射

這是在進步,但我認爲這將歸結到我們相信以下這兩個屬性具有相同的類型:

private void CopyPropertyValue(object source, string sourcePropertyName, object target, string targetPropertyName) 
    { 
     PropertyInfo sourceProperty = source.GetType().GetProperty(sourcePropertyName); 
     PropertyInfo targetProperty = target.GetType().GetProperty(targetPropertyName); 
     targetProperty.SetValue(target, sourceProperty.GetValue(source)); 
    } 

然而我有更多的問題,源類型可能是可空,目標類型沒有。例如Nullable<int> =>int。在這種情況下,我需要確保它仍然有效,並執行了一些合理的行爲,例如NOP或設置該類型的默認值。

可能這是什麼樣的?

+0

也許我只是瘋狂,但知道它似乎是它可以以更好的方式來解決表達式樹的根本問題 –

+0

我不明白,請隨時提供一個答案! –

+0

好,我的意思是,你能解釋一下你想要什麼解決的,你沒怎麼想解決什麼是我們未知的...... –

回答

7

鑑於GetValue返回盒裝表示,這將是可空類型的空值空引用,它很容易檢測,然後但處理您要:

private void CopyPropertyValue(
    object source, 
    string sourcePropertyName, 
    object target, 
    string targetPropertyName) 
{ 
    PropertyInfo sourceProperty = source.GetType().GetProperty(sourcePropertyName); 
    PropertyInfo targetProperty = target.GetType().GetProperty(targetPropertyName); 
    object value = sourceProperty.GetValue(source); 
    if (value == null && 
     targetProperty.PropertyType.IsValueType && 
     Nullable.GetUnderlyingType(targetProperty.PropertyType) == null) 
    { 
     // Okay, trying to copy a null value into a non-nullable type. 
     // Do whatever you want here 
    } 
    else 
    { 
     targetProperty.SetValue(target, value); 
    } 
} 
+0

'Nullable.GetUnderlyingType(targetProperty)'對我來說似乎不好。 –

+0

@JeppeStigNielsen:對不起,本來打算使用'.PropertyType'。固定。 –

+0

我們真的需要兩個,'targetProperty.PropertyType.IsValueType && Nullable.GetUnderlyingType(targetProperty.PropertyType)!= null'? ___編輯:___啊,現在我明白了,你說它是一個值類型_and_它不是特殊值類型'Nullable <>'。一切都很好。 –

相關問題