2016-07-28 10 views
2

Ich bin das Schreiben von Code ein Objekt in eine andere mithilfe von Reflektion zu verwandeln ...eine Nullable-Eigenschaft auf einen Nicht-Nullable Version mit Reflection

Es ist im Gange, aber ich denke, es wäre einkochen dem folgenden, wo wir vertrauen beide Eigenschaften haben die gleiche Art:

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)); 
    } 

jedoch ich das zusätzliche Problem haben, dass die Quelle Typ Null sein könnte und den Zieltyp nicht. z.B. Nullable<int> =>int. In diesem Fall muss ich sicherstellen, dass es immer noch funktioniert und ein sinnvolles Verhalten z. NOP oder setzen Sie den Standardwert für diesen Typ.

Wie könnte das aussehen?

+0

Vielleicht bin ich nur verrückt, aber das zugrunde liegende Problem zu wissen, es scheint, als könnte es Ausdruck Bäume in einer besseren Weise gelöst werden –

+0

Ich folge nicht, bitte zögern Sie nicht, eine Antwort zu bieten! –

+0

nun ich meine, dass Sie erklären könnten, was Sie zu lösen versuchen, nicht, wie Sie lösen wollen, was uns unbekannt ist ... –

Antwort

7

Da GetValue gibt eine boxed Darstellung, die eine Nullreferenz für einen Nullwert des Nullable Type sein wird, ist es leicht zu erkennen und dann handhaben, wie Sie wollen:

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)' scheint mir schlecht. –

+0

@JeppeStigNielsen: Entschuldigung, sollte '.PropertyType' verwenden. Fest. –

+0

Brauchen wir wirklich beide, 'targetProperty.PropertyType.IsValueType && Nullable.GetUnderlyingType (targetProperty.PropertyType)! = Null'? ___ Edit: ___ Ah, jetzt sehe ich, du sagst es ist ein Werttyp _und_ es ist nicht der spezielle Werttyp 'Nullable <>'. Alles ist gut. –