2010-03-05 6 views
2

Je tente de mapper des valeurs de propriétés (via une réflexion) entre différents objets. Cela semble échouer bizarrement sur les types de valeur nullable. Le code suivant:Définition d'une propriété de type valeur null par réflexion

destProperty.SetValue(destObject, sourceProperty.GetValue(sourceObject, null), null); 

ensembles destProperty à null si destProperty est un type de valeur nullable, en dépit d'une valeur propriété source.

Sûrement c'est une tâche assez commune - il me manque quelque chose de simple?

+0

Quel est le type de sourceProperty? Est-il nullable aussi? –

+0

Oui, sourceProperty et destProperty ont des types identiques. – Sam

+0

Avez-vous un héritage, l'une des propriétés est-elle privée? Y a-t-il une implémentation d'interface explicite? –

Répondre

0

Il était quelque chose de simple - destProperty sur cette classe particulière semble être écrit d'ignorer les appels fixes à moins que certaines autres propriétés sont définies d'abord . Je suis assez sûr Je n'aurais pas été responsable d'une telle violation flagrante de nos normes de codage, donc je vais blâmer celui-ci sur l'autre gars. Plutôt sûr. Tantrius pour confirmer que cela devrait fonctionner.

1

Ce que vous avez posté fonctionne pour moi. Juste couru le suivant. destObject.b est égal à 110 après. remarquez que la ligne de code finale est verbatim ce que vous avez posté.

class Foo { 

    public int? a { get; set; } 
    public int? b { get; set; } 

    static void Main(string[] args) { 

     var destObject = new Foo { a = 1, b = 2 }; 
     var sourceObject = new Foo { a = 110, b = 112 }; 
     var destProperty = typeof(Foo).GetProperty("b"); 
     var sourceProperty = typeof(Foo).GetProperty("a"); 

     destProperty.SetValue(destObject, sourceProperty.GetValue(sourceObject, null), null); 
    } 
} 
+0

Hmm - J'ai juste réussi à le faire fonctionner dans un cas de test simple également. Je vais devoir creuser plus pour voir où ça va mal. – Sam

1

semble bon - j'obtenir la juste valeur en Destination:

internal class Test 
{ 
    public Test() 
    { 
     Source = 15; 
    } 

    public int? Source { get; private set; } 
    public int? Destination { get; private set; } 
} 


var testType = typeof(Test); 
var sourceProperty = testType.GetProperty("Source"); 
var destProperty = testType.GetProperty("Destination"); 
var test = new Test(); 
destProperty.SetValue(test, sourceProperty.GetValue(test, null), null); 
Questions connexes