Modifier - Ce problème a été résolu à partir de la v6.11.11!

J'essayais de vider un jeu de résultats de deux manières différentes en fonction d'une propriété d'indicateur en utilisant Util.OnDemand et j'ai trouvé que cela ne fonctionnait pas comme prévu. J'ai pu le reproduire avec ce petit exemple:

    void Main()
    {
        var i = new Test() { Prop1 = "One" };
        i.Dump(exclude:"Prop1");
        Util.OnDemand("On Demand Exclude Prop1", ()=>i).Dump(exclude:"Prop1");
    }
    
    public class Test
    {
        public string Prop1 { get; set; }
    }

Production:

    Test
    UserQuery+Test

    On Demand Exclude Prop1

Après avoir cliqué sur le lien Util.OnDemand:

    Test
    UserQuery+Test

    Test
    UserQuery+Test
    Prop1 One

Résultat attendu:

    Test
    UserQuery+Test

    Test
    UserQuery+Test

Je suis assez sûr que ce n'est pas directement lié à Util.OnDemand mais plus probablement à un problème avec DumpContainer car cela produit également le même résultat non exclu:

    new DumpContainer(i).Dump(exclude:"Prop1");

Y a-t-il quelque chose que je fais mal ici? Des solutions potentielles?

Je n'ai pas vérifié tous les paramètres, mais j'ai confirmé que collapseTo se comporte également mal lorsqu'il est invoqué de cette façon, d'autres potentiellement le sont également.

0
asawyer 11 sept. 2020 à 23:41

2 réponses

Meilleure réponse

Ce n'est pas un comportement idéal: des options telles que include et exclude devraient opérer sur le contenu du conteneur de vidage, pas sur le conteneur lui-même. Je vais obtenir un correctif dans la prochaine version de LINQPad. En attendant, les solutions de contournement suggérées semblent bonnes.

1
Joe Albahari 12 sept. 2020 à 01:59

Je ne crois pas que ce soit possible. Je crois comprendre que Dump(exclude:"") exclut la propriété de l'objet sur lequel la méthode a été appelée. Dans votre cas, vous l'exécutez sur un objet LINQPad.DumpContainer qui n'a pas de propriété Prop1. Je n'ai pas pu exclure Prop1 de DumpContainer.Content.

La solution propre et recommandée consiste à remplacer la méthode ToDump:


public class Test
{
    public string Prop1 { get; set; }

object ToDump()
{
   IDictionary<string,object> custom = new System.Dynamic.ExpandoObject();

   var props = GetType().GetProperties (BindingFlags.Public | BindingFlags.Instance)
       .Where (p => p.Name != "Prop1");

   foreach (var prop in props)
      custom[prop.Name] = prop.GetValue (this);
      
   return custom;
}
}

Une autre façon, si vous ne voulez pas écrire de méthodes supplémentaires, serait de la convertir d'abord en ExpandoObject, ce qui entraînera une moche:

Util.OnDemand("On Demand Exclude Prop1", () => (Util.ToExpando(i, exclude:"Prop1"))).Dump()
2
lukaszberwid 11 sept. 2020 à 21:33