Existe-t-il un équivalent de ToSsortingngBuilder for C # de Java? Que serait une bonne version C #?

Dans le monde Java, nous avons ToSsortingngBuilder d’ Apache Commons pour aider à créer des implémentations toSsortingng ().

Est-ce que quelqu’un connaît une implémentation gratuite et décente pour C #? Existe-t-il de meilleures alternatives que je ne connais pas?

Si aucune implémentation gratuite n’existe, je suppose que cette question devient plus une question de «Qu’est-ce qui ferait un bon ToSsortingngBuilder en C # 3?

Du haut de ma tête:

  • Il pourrait offrir à la fois une reflection et une création manuelle de chaîne ToSsortingng.

  • Ce serait vraiment bien si cela pouvait utiliser des arbres d’expression.

Quelque chose comme ça..

public override ssortingng ToSsortingng() { return new ToSsortingngBuilder(this) .Append(t => t.Id) .Append(t => t.Name) .ToSsortingng(); } 

Ce qui reviendrait:

  "Foo{Id: 1, Name: AName}" 
  • Il pourrait utiliser System.Reflection.Emit pour précomstackr un délégué ToSsortingng.

D’autres idées?

METTRE À JOUR

Pour clarifier, ToSsortingngBuilder est une créature différente de SsortingngBuilder. Je cherche quelque chose qui ressemble aux fonctionnalités de ToSsortingngBuilder d’Apache Common. Il comporte des fonctionnalités telles que le formatage multiligne, différents styles et la création de base de reflection ToSsortingng. Merci.

MISE À JOUR 2

J’ai construit le mien. Voir ici

EDIT : OK, vous voulez utiliser la reflection pour ne pas avoir à taper le nom des propriétés. Je pense que cela vous donnera ce que vous cherchez:

 // forgive the mangled code; I hate horizontal scrolling public sealed class ToSsortingngBuilder { private T _obj; private Type _objType; private SsortingngBuilder _innerSb; public ToSsortingngBuilder(T obj) { _obj = obj; _objType = obj.GetType(); _innerSb = new SsortingngBuilder(); } public ToSsortingngBuilder Append (Expression> expression) { ssortingng propertyName; if (!TryGetPropertyName(expression, out propertyName)) throw new ArgumentException( "Expression must be a simple property expression." ); Func func = expression.Comstack(); if (_innerSb.Length < 1) _innerSb.Append( propertyName + ": " + func(_obj).ToString() ); else _innerSb.Append( ", " + propertyName + ": " + func(_obj).ToString() ); return this; } private static bool TryGetPropertyName (Expression> expression, out ssortingng propertyName) { propertyName = default(ssortingng); var propertyExpression = expression.Body as MemberExpression; if (propertyExpression == null) return false; propertyName = propertyExpression.Member.Name; return true; } public override ssortingng ToSsortingng() { return _objType.Name + "{" + _innerSb.ToSsortingng() + "}"; } } 

Exemple:

 // from within some class with an Id and Name property public override ssortingng ToSsortingng() { return new ToSsortingngBuilder(this) .Append(x => x.Id) .Append(x => x.Name) .ToSsortingng(); } 

Voici le comportement que vous recherchez:

 class Thing { public int Id { get; set; } public ssortingng Name { get; set; } public override ssortingng ToSsortingng() { return new ToSsortingngBuilder(this) .Append(t => t.Id) .Append(t => t.Name) .ToSsortingng() } } void Main() { var t = new Thing { Id = 10, Name = "Bob" }; Console.WriteLine(t.ToSsortingng()); } 

Sortie:

Chose {Id: 10, Nom: “Bob”}

La question initiale concernait le C # 3.5 mais depuis lors, je suis passée au C # 4.

Je pensais partager ma nouvelle version ici au cas où cela profiterait aux autres. Il possède toutes les fonctionnalités mentionnées dans ce fil et est compilé au moment de l’exécution en une méthode Ssortingngify rapide.

Obtenez-le ici: ToSsortingngBuilder

Ce n’est peut-être pas exactement ce que vous recherchez, car ce n’est pas gratuit, mais Resharper le fera. C’est un plugin fantastique pour Visual Studio qui fait beaucoup plus que générer ToSsortingng. Mais ça va faire ça. placez votre curseur dans votre classe, appuyez sur alt + insert et choisissez le formatage des membres.

Utilisez le SsortingngBuilder de .NET.

Notez que vous devrez fournir vous-même un petit modèle.

Par exemple:

 public SsortingngBuilder ToSsortingngBuilder(T type) where T : IYourInterface { SsortingngBuilder sb = new SsortingngBuilder(); sb.append(type.key); // more appends return sb; } 

Fourni de manière un peu generic ici. Vous pourrez créer votre propre solution avec l’espace de noms System.Reflection dans .NET

À votre santé

ObjectPrinter le fera pour vous avec un certain nombre de fonctionnalités personnalisables. La documentation est encore un peu approximative, mais nous l’utilisons en production depuis des années avec d’excellents résultats.

Je pense que vous utilisez quelque chose avec l’utilisation d’Expressions. J’ai lu cet article l’autre soir: Obtention d’informations sur les objects, les types et les membres avec des arbres d’expression

Je parie que vous pourriez combiner ces techniques avec le code que Dan a publié sur ce fil pour obtenir ce que vous recherchez.

Je ne connais aucun projet existant qui ferait ce que vous voulez, mais il ne serait pas si difficile de mettre en œuvre l’exemple que vous avez donné en utilisant lambdas.

Voici une autre idée [non testée / non compilée / éventuellement défectueuse] utilisant des delegates anonymes:

 public override ssortingng ToSsortingng() { return this.ToSsortingng(x => { x.Append(t => t.Id); x.Append(t => t.Name); }); } 

Cette surcharge ToSsortingng() serait écrite en tant que méthode d’extension. Vous obtiendrez ainsi une référence à l’object source et accepterez une Action où [T] est le type de l’object source. La méthode ToSsortingng () créerait ensuite un constructeur de chaînes ou un object interne, exécuterait la méthode anonyme transmise par l’appelant, puis encapsulerait le résultat dans tout texte d’ouverture / fermeture nécessaire.

Pour être clair, je n’ai pas vraiment essayé cela. Je pense simplement que c’est un peu plus flexible que l’exemple basé sur le lambda dans la question initiale.