J'essaie de comparer deux objets complexes en C#, et de produire un dictionnaire contenant les différences entre les deux.Réflexion - comparaison d'objets et valeurs par défaut
Si j'ai une classe comme ceci:
public class Product
{
public int Id {get; set;}
public bool IsWhatever {get; set;}
public string Something {get; set;}
public int SomeOtherId {get; set;}
}
Et un exemple, ainsi:
var p = new Product
{
Id = 1,
IsWhatever = false,
Something = "Pony",
SomeOtherId = 5
};
et un autre:
var newP = new Product
{
Id = 1,
IsWhatever = true
};
Pour obtenir les différences entre ceux-ci, i fais des choses qui comprend ceci:
var oldProps = p.GetType().GetProperties();
var newProps = newP.GetType().GetProperties();
// snip
foreach(var newInfo in newProps)
{
var oldVal = oldInfo.GetValue(oldVersion, null);
var newVal = newInfo.GetValue(newVersion,null);
}
// snip - some ifs & thens & other stuff
et il est cette ligne qui est d'intérêt
var newVal = newInfo.GetValue(newVersion,null);
En utilisant l'exemple des objets ci-dessus, cette ligne me donnerait une valeur par défaut de 0 pour SomeOtherId
(même histoire pour bools & DateTimes & whathaveyou).
Qu'est-ce que je cherche est d'avoir newProps
inclure uniquement les propriétés qui sont explicitement spécifiées dans l'objet, donc dans l'exemple ci-dessus, Id
et . J'ai joué environ avec BindingFlags
en vain.
Est-ce possible? Y a-t-il une façon plus propre/meilleure de le faire, ou un outil qui est là pour me sauver la peine?
Merci.
try [AutoMapper] (http: // automapper.org /) (gratuit) ... – Yahia
Il n'existe aucun moyen de savoir si une propriété a été explicitement initialisée de cette manière. Le CLR n'en garde tout simplement pas une trace. – MattW
Pour autant que j'ai compris votre tâche, vous ne pouvez pas faire cela. Vous ne pouvez pas différencier à l'exécution si vous avez créé l'objet en définissant 'bool' sur false ou s'il était défini par défaut lors de la création de l'objet –