感谢阅读。我想写一个小解析器。我想要做的是以下内容。该数据库包含3个表。一个是Persons(Name,LastName,Age),一个是TextTemplates(“这个文档属于。”),另一个是TemplateElements(例如,......)。因此,用户可以选择TextTemplate,编辑它并添加更多TemplateElements。当他按下按钮时,系统应该通过将PeopleElements替换为Persons表中人员的相应属性来生成PDF文档。问题是获取与TemplateElement匹配的person属性。我当然可以写一些:
foreach(element...){
if(element.Equals("<Name>"))
text.Replace("<Name>", Person.Name);
if(element.Equals("<LastName>"))
text.Replace("<LastName>", Person.LastName);
}
但我希望尽可能保持这种动态。属性和TemplateElements将来可能会发生变化。因此,最好的解决方案是以某种方式根据实际元素获取相应的属性。
如果你们其中一个人有解决方案,那将是非常好的。
谢谢;)
答案 0 :(得分:1)
查看这些博客文章,其中讨论了“命名格式化程序”的一些实现:
基本上,我们的想法是在string
上定义一个扩展方法,允许您根据{PropertyName}
示例:
Person person = GetPerson();
string text = "Hello, {Name} {LastName}";
var evaluated = text.FormatWith(person);
答案 1 :(得分:0)
所以这是我的结果,它完全符合我的需要;)
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;
}
因此,我不必关心Person的属性。添加或删除属性不会影响此方法的功能。它只是在inputText中查找现有的templateElements,并用Persons-Object的匹配属性替换它们(如果有匹配的那个;))。如果有任何建议请告诉我。