Проверка свойств в динамических объектах - PullRequest
0 голосов
/ 28 февраля 2019

Я использую Scriban для рендеринга HTML-шаблонов для почтовой службы.Scriban позволяет мне отображать html, используя объект и html-шаблон, как показано ниже:

<ul id='model'>\n<h2>Name 2: {{ model.Username }}</h2>\n<h1>Message 2: {{ model.Password }}</h1>\n</ul>

Мне нужно проверить, что определенные свойства существуют в динамическом объекте.В приведенном выше примере соответствующий динамический объект должен содержать свойство " Имя пользователя " и свойство " Пароль ".


Я создал решениеэто работает, но очень хакерски, мне стыдно называть себя разработчиком, и в NO WAY будет частью моего окончательного решения:

    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];
        }  
    }

Как мне проверитьесли определенное свойство существует в динамическом объекте?

1 Ответ

0 голосов
/ 28 февраля 2019

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

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

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

...