Я использую Scriban для рендеринга HTML-шаблонов для почтовой службы. Scriban позволяет мне рендерить html, используя объект и HTML-шаблон, как показано ниже:
<ul id='model'>\n<h2>Name 2: {{ model.Username }}</h2>\n<h1>Message 2: {{ model.Password }}</h1>\n</ul>
Мне нужно проверить, что определенные свойства существуют в динамическом объекте. В приведенном выше примере соответствующий динамический объект должен содержать свойство " Имя пользователя " и свойство " Пароль ".
Я создал решение, которое работает, но оно очень хакерское, мне стыдно называть себя разработчиком, и НИКОГДА не буду частью моего окончательного решения:
private readonly string template = "<ul id='model'>\n<h2>Name 2: {{ model.Username }}</h2>\n<h1>Message 2: {{ model.Password }}</h1>\n</ul>";
private readonly dynamic model = new {Username = "user1", Password = "pass"};
public void Validate()
{
//Convert dynamic object to dictionary
var data = JsonConvert.DeserializeObject<Dictionary<string, string>>(JsonConvert.SerializeObject(model));
//Regex pattern for finding properties in html-string
Regex pattern = new Regex("(?<={{ )(.*?)(?= }})");
//Properties in html-string
MatchCollection matches = pattern.Matches(template);
//Check if dynamic object contains a property for each match
foreach (Match match in matches)
{
var matchString = match.ToString();
//Remove "model." from match. This should be done by regex instead.
var property = matchString.Substring(matchString.IndexOf('.') +1);
//Throws an exception, if the dynamic object doesnt contain the property.
var result = data[property];
}
}
Как мне проверить, существует ли определенное свойство в динамическом объекте?
Вы должны попробовать использовать класс объекта Dynamic, ваша модель может наследовать от класса. Это позволит вам контролировать то, что происходит, когда вы пытаетесь установить/получить доступ к членам динамического объекта.
Класс DynamicObject позволяет вам определить, какие операции могут выполняться над динамическими объектами и как выполнять эти операции. Например, вы можете определить, что происходит, когда вы пытаетесь получить или установить свойство объекта, вызвать метод или выполнить стандартные математические операции, такие как сложение и умножение.
Подробности см.: https://docs.microsoft.com/en-us/dotnet/api/system.dynamic.dynamicobject?view=netframework-4.7.2.