Сохранение переменной внутри строки в базе данных и перевод во время выполнения

#c# #.net #model-view-controller

#c# #.net #модель-представление-контроллер

Вопрос:

Я пытаюсь создать в своем приложении модуль, в котором пользователь (читай администратор) мог бы хранить шаблонное сообщение электронной почты в базе данных, которое приложение отправит при инициированном событии.

Я пробовал string.Формат (message,modelVar), однако он завершается неудачей, поскольку он не считает его допустимым.

Я предоставляю пользователю «понятное имя» для переменной model и сохраняю его как [modelVar.field] в базе данных. Я делаю это для того, чтобы пользователь на самом деле не видел фактическое имя таблицы базы данных или название модели, связанное с полем. Я перевел это во время выполнения в {modelVar.field}, но, похоже, это тоже не работает.

Пользователь увидит сообщение в приложении как «сообщение message message [modelVar.field] …»

Кто-нибудь знает, как я могу сохранить переменную.Имя_поля в базе данных безопасным способом, который я действительно могу перевести в код во время выполнения, и как бы я это сделал? Спасибо.

Ответ №1:

Я нашел способ, но надеялся на более элегантное решение.

 private string processCode(string bodyText, tbl_user user)
    {
        int counter = 0;
        while (bodyText.Count(a => a == '[') > 0 || counter > 100)
        {
            int first = bodyText.IndexOf("[")   1;
            int next = bodyText.IndexOf("]", first)   1;
            int length = (bodyText.Length - first)   (bodyText.Length - next);
            string variable = bodyText.Substring(first, length - 1);
            string field = variable.Replace($"{nameof(user)}.", "");
            string value = user.GetType().GetProperty(field).GetValue(user).ToString();
            bodyText=bodyText.Replace($"[{variable}]", value);
            counter  ;
        }
        return bodyText;
    }
  

Редактировать:
использован более простой цикл, предложенный Glen

 private static string processCode(string bodyText, tbl_user tco)
{
    PropertyInfo[] props = tco.GetType().GetProperties();
    foreach (PropertyInfo prop in props)
    {
        string value = prop.GetValue(tco).ToString();
        bodyText = bodyText.Replace($"[tco.{prop.Name }]", value);
    }
    return bodyText;
}
  

Комментарии:

1. Не могли бы вы сделать это наоборот и выполнить итерацию по свойствам user: foreach (var p в user. GetType().GetProperties()) { bodytext.Replace($»[{p.Name }]», пользователь. GetType().getProperty(p.Name ). Получаем значение (user). toString()); } . Таким образом, вам нужно выполнить цикл только один раз для каждого свойства пользователя, а не один раз для каждой строки шаблона

2. Я могу. я обновлю выше, чтобы показать другой цикл.