Ce qui est une bonne façon de faire de la chaîne de création de modèles dans .NET?
J'ai besoin d'envoyer des notifications aux utilisateurs et j'ai besoin de permettre à l'administrateur de fournir un modèle pour le corps du message (et, éventuellement, en-têtes, trop).
Je voudrais quelque chose comme string.Format
qui me permet de donner nommé chaînes de remplacement, de sorte que le modèle peut ressembler à ceci:
Dear {User},
Your job finished at {FinishTime} and your file is available for download at {FileURL}.
Regards,
--
{Signature}
Quel est le moyen le plus simple pour moi de le faire?
- Il ya quelques excellentes suggestions dans les réponses à cette question: stackoverflow.com/questions/620265
- Hey, c'est maintenant une fonctionnalité du langage, j'ai ajouté une réponse montrant que.
- essayez de github.com/beto-rodriguez/Templator, il prend en charge la chaîne, xml et html
Vous devez vous connecter pour publier un commentaire.
Utiliser un moteur de template. StringTemplate est l'un de ceux, et ils sont nombreux.
Ici est la version pour ceux d'entre vous qui pouvez utiliser une nouvelle version de C#:
En ligne - c'est maintenant entièrement pris en charge pour le langage (de la chaîne d'interpolation).
String.Format()
, et n'aide pas si vous êtes l'obtention de la chaîne de modèle au moment de l'exécution. +1 pour la meilleure façon de le faire au moment de la compilation, si.The interpolated string is evaluated each time the code with the interpolated string executes. This allows you to separate the definition and evaluation of an interpolated string.
Ou suis-je à la lecture de ce mal?string.Format()
de substitution, et alors qu'il est possible de permettre à l'utilisateur de redéfinir ces, ils ne sont pas particulièrement convivial parce qu'ils ne peuvent plus utiliser nom valeurs dans le modèle. Ce que j'ai est après, quand je suis arrivé à cette question était quelque chose comme la solution que j'ai finalement écrit ma réponse.Vous pouvez utiliser la "chaîne de caractères.Le Format de la" méthode:
Il vous permet de modifier le contenu dans le futur et est conviviale pour la localisation.
SmartFormat est assez simple bibliothèque qui répond à toutes vos exigences. Il est axé sur la composition de "langue naturelle" du texte, et est idéal pour la génération de données de listes ou de l'application de la logique conditionnelle.
La syntaxe est très similaire à
String.Format
, et est très simple et facile à apprendre et à utiliser. Voici un exemple de la syntaxe à partir de la documentation:La bibliothèque a une grande erreur d'options de gestion (ignorer les erreurs, les erreurs de sortie, de générer des erreurs). Évidemment, ce serait le travail parfait pour votre exemple.
La bibliothèque est open source et facilement extensible, ainsi vous pouvez également l'enrichir avec des fonctionnalités supplémentaires aussi.
string.Format
avecSmart.Format
de sorte que vous pouvez développer progressivement des modèles. Merci!Vous pourriez utiliser des chaînes de caractères.Remplacer(...), éventuellement dans un chacun à travers tous les mots clés. Si il y a seulement quelques mots-clés que vous pouvez avoir sur une ligne comme ceci:
Ou vous pouvez utiliser les Regex.Remplacer(...), si vous avez besoin de quelque chose d'un peu plus puissant et avec plus d'options.
Lire ce article sur codeproject pour voir quelle chaîne de caractères de remplacement option est la plus rapide pour vous.
Bâtiment sur Benjamin Gruenbaum réponse, en version C# 6 vous pouvez ajouter un @ l' $ et assez bien utiliser votre code tel qu'il est, par exemple:
La
$
est pour la chaîne d'interpolation: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/tokens/interpolatedLa
@
est le verbatim de l'identificateur: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/tokens/verbatim...et vous pouvez les utiliser conjointement.
:o)
En fait, vous pouvez utiliser XSLT.
Vous créez un simple modèle XML:
Puis créer un XmlDocument pour effectuer la transformation à l'encontre de:
XmlDocument xmlDoc = new XmlDocument();
Après cela, appliquer la transformation:
La mise en œuvre de votre propre mise en forme personnalisée pourrait être une bonne idée.
Voici comment vous le faites. Tout d'abord, créez un type qui définit les trucs que vous voulez injecter dans votre message. Note: je ne vais illustrer cela avec l'Utilisateur de votre modèle...
Prochaine, de mettre en œuvre une simple mise en forme personnalisée...
Enfin, l'utiliser comme ça...
... qui va générer le texte "Chers Martin Peck. Votre tâche est terminée...".
Très simple regex à base de solution. Prend en charge
\n
de style de caractère unique des séquences d'échappement et{Name}
-style nommé variables.Source
D'utilisation
Notes
\n
,\r
,\\
et\{
les séquences d'échappement et codés en dur pour eux. Vous pouvez facilement ajouter plus ou rendre définissables par le consommateur.RegexOptions.IgnoreCase
drapeau.Match.Value
au lieu de la chaîne vide à la fin de laRegex.Replace
de rappel. Vous pouvez également lancer une exception.{var}
la syntaxe, mais cela pourrait interférer avec le natif interpolées syntaxe de la chaîne. Si vous souhaitez définir des modèles dans les littéraux de chaîne dans vous code, il peut être souhaitable de modifier la variable délimiteurs, par exemple%var%
(regex\\.|%([a-z0-9_.\-]+)%
) ou de certains autres éléments de la syntaxe de votre choix qui est le plus approprié au cas d'utilisation.RegexOptions.IgnoreCase
j'ai dû ajouter un groupeA-Z
à laRenderExpr
, trop.Si vous avez besoin de quelque chose de très puissant (mais vraiment pas la façon la plus simple) vous pouvez héberger ASP.NET et l'utiliser comme moteur de template.
Vous aurez toute la puissance de ASP.NET pour formater le corps de votre message.
Si vous êtes le codage en VB.NET vous pouvez utiliser les littéraux XML. Si vous êtes le codage en C#, vous pouvez utiliser ShartDevelop d'avoir des fichiers en VB.NET dans le même projet que le code C#.