Primordial ToString() de la Liste<Maclasse>
J'ai une classe Maclasse, et je voudrais surcharger la méthode ToString() de cas de la Liste:
class MyClass
{
public string Property1 { get; set; }
public int Property2 { get; set; }
/* ... */
public override string ToString()
{
return Property1.ToString() + "-" + Property2.ToString();
}
}
Je voudrais avoir les éléments suivants:
var list = new List<MyClass>
{
new MyClass { Property1 = "A", Property2 = 1 },
new MyClass { Property1 = "Z", Property2 = 2 },
};
Console.WriteLine(list.ToString()); /* prints: A-1,Z-2 */
Est-il possible de le faire? Ou j'aurais à la sous-classe List<Maclasse> de surcharger la méthode ToString() dans mon sous-classe? Puis-je résoudre ce problème en utilisant des méthodes d'extension (c'est à dire, est-il possible de remplacer une méthode avec une méthode d'extension)?
Merci!
- Pour information: j'ai essayé de faire quelque chose en rapport avec NHibernate, et la cartographie des collections dans une chaîne sérialisée qui correspondent à une seule colonne. Cependant j'ai trouvé un autre moyen de le faire, par mettre en place mes propres IUserType, et ma mise en œuvre des constructions de la chaîne que j'en ai besoin! Merci à tous ceux qui ont répondu de toute façon!
Vous devez vous connecter pour publier un commentaire.
Vous aurez besoin de sous-classe de remplacer n'importe quelle méthode. Le point de génériques est-à-dire que vous voulez le même comportement quel que soit le type de T. Si vous voulez changer de comportement pour un type spécifique de T alors de rompre le contrat et aura besoin d'écrire votre propre classe:
Modifiées afin d'ajouter:
Non, vous ne pouvez pas remplacer une méthode par la création d'une extension, mais vous pouvez créer une nouvelle méthode avec une signature différente est spécifique à ce type de liste:
Utilisé avec
Je pense toujours que vous êtes mieux de sous-classement si...
MyClass
classe. Donc ce n'est pas beaucoup d'effort supplémentaire à faire, même si cela paraît compliqué de créer une nouvelle classe, c'est vraiment pas parce que la plupart des fonctionnalités est héritée de laList
classe...ToString
méthode est logiquement ce que vous voulez, etList
n'est pas très utile par défaut de mise en œuvre. Extension permettrait d'ajouter une nouvelle méthode et de laisser leToString
méthode tout aussi inutile, comme elle l'a toujours été pour le génériqueList
classe.Peut-être un peu hors-sujet, mais j'utilise un
ToDelimitedString
méthode d'extension qui fonctionne pour toutIEnumerable<T>
. Vous pouvez (en option) spécifier le délimiteur à utiliser et d'un délégué pour effectuer un personnalisé conversion de chaîne de caractères pour chaque élément:Vous pouvez réellement utiliser unicode astuce pour vous permettre de définir une autre méthode ToString directement sur votre liste générique.
Si vous activez l'hex d'entrée de caractères dans visual studio, vous pouvez créer des caractères invisibles en maintenant la touche Alt enfoncée, puis en appuyant sur les éléments suivants sur votre clavier numérique + F F F 9 (maintenant, relâchez la touche Alt)
Nous pouvons donc créer la fonction suivante avec un personnage invisible placé à côté de son nom... (oui, je sais que son code VB, mais le concept fonctionne toujours travailler pour C#)
Maintenant dans visual studio, lorsque vous accédez à intellisense à l'encontre de votre liste, vous serez en mesure de choisir entre le standard ToString ou votre fonction personnalisée.
Pour permettre à caractère hex d'entrée dans visual studio, vous pouvez avoir besoin de modifier votre base de registre
ouvrez HKEY_CURRENT_USER\Control Panel\Méthode de Saisie
et créer un REG_SZ appelé EnableHexNumpad fixé à 1
Vous aurez également besoin de désactiver l' & raccourcis pour le Fichier, Edition, Débogage, les Données des menus,
Dans visual studio, ouvrez le menu outils, sélectionnez personnaliser, puis ouvrez l'onglet commandes, et à l'aide de la modifier le bouton de sélection pour n'importe quel élément de menu qui utilise de l'ABCDEF charactes pour sa coupe courte, par la suppression de la &
Sinon vous allez ouvrir les menus contextuels, au lieu de taper des caractères hexadécimaux.
Si vous la méthode doit être nommé
ToString
vous aurez pour dériver une classe à partir deList
. Vous pouvez faire un générique:Dans ce cas, vous devez utiliser
MyList
au lieu deList
tout au long de votre application si vous souhaitez avoir votre coutume de conversion.Toutefois, si vous pouvez choisir un autre nom pour votre méthode, vous pouvez utiliser les méthodes d'extension et d'obtenir le même effet, avec presque aucune modification de votre code:
Vous pouvez utiliser des méthodes d'extension pour le rendre plus générique:
Vous pouvez l'utiliser sur n'importe quelle instance de
IEnumerable<T>
, comme s'il s'agissait d'une méthode ordinaire:Vous devez créer votre propre classe qui hérite de la Collecte et ensuite overwride la méthode ToString() de cette classe en particulier.
Non ce n'est pas possible. ToString de TList va vous donner la représentation de chaîne de la liste d'objets.
Vos options sont:
Espère que ça aide!
Selon la raison exacte que vous avez de vouloir remplacer
List<T>.ToString()
pour revenir à quelque chose de spécifique, il pourrait être pratique d'avoir un coup d'oeil à la coutumeTypeConverter
implémentations.Si vous voulez simplement un
List<T>
spécifiquesT
à se montrer d'une certaine manière comme unstring
dans des endroits où TypeConverters sont utilisés, comme dans le débogueur ou dansstring.Format("List: {0}", listVariable)
type de situations, cela peut être suffisant.Vous pourriez avoir vu le résultat de ToString() d'être indiqué quelque part et je voulais changer les choses, sans savoir à propos de l'existence de
TypeConverter
et les endroits où ils sont utilisés. Je crois que beaucoup de/la plupart/tous (pas sûr?) de la valeur par défaut TypeConverters dans le .NET Framework simplement utiliser ToString() lors de la conversion de tout type pour lequel ils sont définis pour unestring
.