Проверка свойств в динамических объектах

2

Я использую 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

1 ответ

2
Лучший ответ

Вы должны попробовать использовать класс объекта Dynamic, ваша модель может наследовать от класса. Это позволит вам контролировать то, что происходит, когда вы пытаетесь установить/получить доступ к членам динамического объекта.

Класс DynamicObject позволяет вам определить, какие операции могут выполняться над динамическими объектами и как выполнять эти операции. Например, вы можете определить, что происходит, когда вы пытаетесь получить или установить свойство объекта, вызвать метод или выполнить стандартные математические операции, такие как сложение и умножение.

Подробности см.: https://docs.microsoft.com/en-us/dotnet/api/system.dynamic.dynamicobject?view=netframework-4.7.2.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню