【问题标题】:Validating properties in dynamic objects验证动态对象中的属性
【发布时间】:2019-07-22 02:14:11
【问题描述】:

我正在使用 Scriban 为邮件服务呈现 html 模板。 Scriban 允许我使用对象和 html 模板来呈现 html,如下所示:

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

我需要验证动态对象中是否存在某些属性。在上面的例子中,匹配的动态对象需要包含一个“Username”属性和一个“Password”属性。


我创建了一个可行的解决方案,但它非常老套,让我自称为开发人员感到羞耻,并且绝不会成为我最终解决方案的一部分:

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

如何验证动态对象中是否存在某个属性?

【问题讨论】:

标签: c# validation dynamic scriban


【解决方案1】:

您应该尝试使用 Dynamic 对象类,您的模型可以从该类继承。这将允许您控制尝试设置/访问动态对象的成员时发生的情况。

DynamicObject 类使您能够定义哪些操作可以 对动态对象执行以及如何执行这些操作。为了 例如,您可以定义当您尝试获取或设置 对象属性、调用方法或执行标准数学运算 加法和乘法等运算。

详情请见:https://docs.microsoft.com/en-us/dotnet/api/system.dynamic.dynamicobject?view=netframework-4.7.2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 2018-04-09
    • 2017-05-23
    • 2021-09-26
    相关资源
    最近更新 更多