【发布时间】:2018-11-10 14:33:55
【问题描述】:
有没有用动态数据替换占位符的好方法? 我尝试加载一个模板,然后用元对象中的数据替换所有 {{PLACEHOLDER}} 标记,这是有效的。 但是如果我需要添加更多占位符,我必须在代码中完成,并进行新的部署,所以如果可能的话,我想通过数据库来完成,像这样:
Table Placeholders
ID, Key (nvarchar(50), Value (nvarchar(59))
1 {{RECEIVER_NAME}} meta.receiver
2 {{RESOURCE_NAME}} meta.resource
3 ..
4 .. and so on
meta 是发送到 BuildTemplate 方法的参数的名称。
因此,当我遍历所有占位符(来自 db)时,我想将值从 db 转换为元对象。 我需要参数中的值,而不是获取“meta.receiver”。
GetAllAsync ex.1
public async Task<Dictionary<string, object>> GetAllAsync()
{
return await _context.EmailTemplatePlaceholders.ToDictionaryAsync(x => x.PlaceholderKey, x => x.PlaceholderValue as object);
}
GetAllAsync ex.2
public async Task<IEnumerable<EmailTemplatePlaceholder>> GetAllAsync()
{
var result = await _context.EmailTemplatePlaceholders.ToListAsync();
return result;
}
样本不使用数据库(工作))
private async Task<string> BuildTemplate(string template, dynamic meta)
{
var sb = new StringBuilder(template);
sb.Replace("{{RECEIVER_NAME}}", meta.receiver?.ToString());
sb.Replace("{{RESOURCE_NAME}}", meta.resource?.ToString());
return sb.ToString();
}
我希望它如何工作
private async Task<string> BuildTemplate(string template, dynamic meta)
{
var sb = new StringBuilder(template);
var placeholders = await _placeholders.GetAllAsync();
foreach (var placeholder in placeholders)
{
// when using reflection I still get a string like "meta.receiver" instead of meta.receiver, like the object.
// in other words, the sb.Replace methods gives the same result.
//sb.Replace(placeholder.Key, placeholder.Value.GetType().GetField(placeholder.Value).GetValue(placeholder.Value));
sb.Replace(placeholder.Key, placeholder.Value);
}
return sb.ToString();
}
我认为这可能是解决此问题的更好方法。请告诉我!
【问题讨论】:
-
我想你想要像 angularjs 那样的字符串插值?
-
“代码不工作”不是一个好的描述。如果您在
placeholder.Value属性中具有正确的值,则代码应该可以工作。如果您不这样做,那么不是您发布的代码不正确,而是您尚未发布的.GetAllAsync()方法。请发帖minimal reproducible example。 -
您好 Lasse,感谢您的指正!问题是我尝试了不同类型的 GetAllAsync 返回 IEnumerable
、IDictionary 等等,但我遇到了同样的问题。代码有效,但不是我想要的。
标签: c# sql entity-framework dynamic property-placeholder