2010-10-21 36 views
2

Si j'ai un objet qui est entre autres un IEnumerable et que je vider cet objet, j'obtiens les valeurs énumérées.Comment puis-je vider les propriétés normales sur un IEnumerable dans Linqpad

Y at-il un moyen d'obtenir LINQPad à la liste des autres propriétés:

exemple ci-dessous Se: Puis-je être Dump d'inclure Bonjour et propriétés chiffres?

void Main() 
{ 
    var t = new test(); 
    var d = new Dictionary<string,string> {{"Hello","World"},{"Good by","Sky"}}; 

    t.Dump(); 
    d.Dump(); 
} 

// Define other methods and classes here 

public class test : IEnumerable 
{ 
    public string Hello { get { return "World"; }} 
    public List<int> digits { get { return new List<int> {0,1,2,3,4,5,6,7,8,9}; }} 

    public IEnumerator GetEnumerator() { yield return "Hej"; } 
} 
+0

rien liek une réponse rapide - vous devez ajouter votre propre méthode ToDump() à l'objet. Voir https://www.linqpad.net/CustomizingDump.aspx –

Répondre

1

Pour autant que je peux dire si l'objet que vous essayez de jeter des outils IEnumerable alors LINQPad veut toujours vider comme une liste IEnumerable. Se débarrasser de l'interface affiche correctement les propriétés Hello et digits dans les informations sous-évaluées.

Allant de this link il semble que vous pouvez écrire votre propre décharge qui accomplit quelque chose comme LINQPad en dénombrant la collection et toutes ses propriétés puis sortir la chose comme une chaîne de XHTML. Je n'ai pas essayé ça.

+0

J'ai accepté cela comme la réponse car elle explique la raison pour laquelle Dump agit comme il le fait. Je regardais principalement s'il y avait un paramètre ou un paramètre que je pourrais utiliser. –

0

Utilisez un sérialiseur? JSON.NET fera tout cela pour vous dans un format JSON.

Newtonsoft.Json.JsonConvert.SerializeObject (t, Newtonsoft.Json.Formatting.Indented)

si vous ne voulez pas JSON, puis choisissez un sérialiseur que vous voulez, ou vous aurez juste à faire ce qu'un sérialiseur ferait, utilisez la réflexion pour itérer les propriétés sur l'objet.

5

Vous pouvez écrire une méthode d'extension DumpPayload comme suit:

void Main() 
{ 
    var t = new test(); 
    t.DumpPayload(); 
} 

public static class Extensions 
{ 
    public static void DumpPayload (this IEnumerable o) 
    { 
     if (o == null) 
     { 
      o.Dump(); 
      return; 
     } 
     var d = new Dictionary<string,object>();   
     foreach (var member in o.GetType().GetProperties()) 
      try 
      { 
       d[member.Name] = member.GetValue (o, null); 
      } 
      catch (Exception ex) 
      { 
       d[member.Name] = ex; 
      }   
     d["AsEnumerable"] = o; 
     d.Dump(); 
    } 
} 

Si vous mettez cette méthode d'extension dans « Mes extensions », il sera disponible à toutes les requêtes.

Une autre solution consiste à mettre en œuvre ICustomMemberProvider dans la classe de test:

public class test : IEnumerable, ICustomMemberProvider 
{ 
    public string Hello { get { return "World"; }} 
    public List<int> digits { get { return new List<int> {0,1,2,3,4,5,6,7,8,9}; }} 

    public IEnumerator GetEnumerator() { yield return "Hej"; } 

    IEnumerable<string> ICustomMemberProvider.GetNames() 
    { 
     return "Hello Enumerator".Split(); 
    } 

    IEnumerable<Type> ICustomMemberProvider.GetTypes() 
    { 
     return new [] { typeof (string), typeof (IEnumerable) }; 
    } 

    IEnumerable<object> ICustomMemberProvider.GetValues() 
    { 
     return new object [] { Hello, this.OfType<Object>() }; 
    } 
} 

Notez que si la classe de test est définie dans un autre assemblage, vous n'avez pas besoin de faire référence à LINQPad afin de mettre en œuvre ICustomMemberProvider. Vous pouvez simplement coller dans la définition suivante dans votre projet et vous LINQPad le ramasser:

namespace LINQPad 
{ 
    public interface ICustomMemberProvider 
    { 
     IEnumerable<string> GetNames(); 
     IEnumerable<Type> GetTypes(); 
     IEnumerable<object> GetValues(); 
    } 
} 
+0

Cette réponse mérite bien plus de upvotes, ICustomMemberProvider m'a aidé quand j'avais un type personnalisé qui était ICollection (où self est ce type) pour les données récursives et les sous-classes qui ont hérité de ce type personnalisé. Maintenant, ma structure se décharge correctement! – agrath