2011-05-03 3 views
1

merci pour la lecture. J'essaie d'écrire un petit analyseur. Ce que j'essaie de faire est le suivant. La base de données contient 3 tables. Un avec Person (Nom, LastName, Age), un avec TextTemplates ("Ce document appartient à.") Et un avec TemplateElements (par exemple, ...). Ainsi, l'utilisateur peut choisir un TextTemplate, le modifier et ajouter plus de TemplateElements. Comme il appuie sur un bouton, le système devrait générer des documents PDF en remplaçant les TemplateElements par les propriétés correspondantes des personnes hors de la table Persons. Le problème est d'obtenir la propriété persons qui correspond à TemplateElement. Bien sûr, je pourrais en écrire:.net analyseur de texte dynamique

foreach(element...){  
    if(element.Equals("<Name>")) 
     text.Replace("<Name>", Person.Name); 
    if(element.Equals("<LastName>")) 
     text.Replace("<LastName>", Person.LastName); 
} 

mais je veux garder ceci aussi dynamique que possible. Les propriétés et les TemplateElements pourraient changer dans le futur. Donc, la meilleure solution serait d'obtenir en quelque sorte la propriété correspondante en fonction de l'élément réel.

Serait très bien si l'un d'entre vous a une solution pour cela.

Merci;)

Répondre

1

Jetez un oeil à ces postes de blog où certaines implémentations de 'nommées formatteurs' sont discutés:

Essentiellement, l'idée est que vous définissez une méthode d'extension sur string qui vous permet de formater une chaîne basée sur une syntaxe l ike {PropertyName}

Exemple:

Person person = GetPerson(); 
string text = "Hello, {Name} {LastName}"; 
var evaluated = text.FormatWith(person); 
+0

Merci beaucoup. Je ne savais pas vraiment quoi chercher ni comment cela pourrait être résolu. Merci de m'avoir aidé. – benjamin

+0

@benjamin si cela répond à votre question, vous pouvez vouloir 'l'accepter' – jeroenh

0

Voici donc mon résultat qui fait exactement ce que je besoin de le faire;)

private string ReplaceTemplateElements(Person person, string inputText) 
    { 
     //RegExp to get everything like <Name>, <LastName>... 
     Regex regExp = new Regex(@"\<(\w*?)\>", RegexOptions.Compiled); 
     //Saves properties and values of the person object 
     Dictionary<string, string> templateElements = new Dictionary<string, string>(); 
     FieldInfo[] fieldInfo; 
     Type type = typeof(Person); 

     fieldInfo = type.GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public); 
     //Putting every property and value in the dictionary 
     foreach (FieldInfo info in fieldInfo) 
     { 
      templateElements.Add(info.Name.TrimStart('_'), info.GetValue(person).ToString()); 
     } 

     //Replacing the matching templateElements with the persons properties 
     string result = regExp.Replace(inputText, delegate(Match match) 
     { 
      string key = match.Groups[1].Value; 
      return templateElements[key]; 
     }); 
     return result; 
    } 

Donc, avec cela, je n'ont pas de se soucier des propriétés d'une personne. L'ajout ou la suppression d'une propriété n'affectera pas la fonctionnalité de cette méthode. Il recherche simplement les templateElements existants dans l'inputText et les remplace par la propriété correspondante de l'objet Persons-Object (s'il y en a une correspondante;)). S'il y a des suggestions s'il vous plaît dites-moi.