Есть ли хороший способ заменить заполнители динамическими данными?Я попытался загрузить шаблон, а затем заменил все {{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
метаэто имя параметра, отправляемого в метод BuildTemplate.
Поэтому, когда я перебираю все метки-заполнители (из БД), я хочу привести значение из БД в мета-объект.Вместо получения 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;
}
sampleне использует db (работает))
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();
}
Я думаю, что это может быть лучшим решением для этой проблемы.Пожалуйста, дайте мне знать!