为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 Dictionary<int, object> 上的 Required 属性来防止空值?

如何使用 Dictionary<int, object> 上的 Required 属性来防止空值?

C#
慕尼黑的夜晚无繁华 2022-10-15 14:25:01
我有一个类,其中包含一个Dictionary<int, object>标记为必需的属性。当我将进入控制器的数据反序列化到该类上时,该Required属性会阻止nulls 进入该属性,但它不会阻止nulls 作为值输入字典,因为键值对已正确格式化和传递。有没有办法让Required属性也阻止nulls 成为字典中的值?或者是否可以向该属性添加另一个属性来完成此操作?或者解决这个问题的最好方法是推出我自己的类,该类基本上由键值对组成,我可以将键属性和值属性标记为Required?前任:public class Example{    [Required]    public int Key;    [Required]    public object Value;}然后只是有一个IEnumerable<Example>而不是Dictionary<int, object>?
查看完整描述

2 回答

?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

我能想到的最好的方法是ISet<Example>(使用 a HashSet<Example>)覆盖Example'sGetHashCode和方法。Equals那应该满足你的第二个愿望。至于[Required]属性,您必须自己编写代码以检查这些属性是否不为空,然后再将其添加到ISet<Example>. 这可能需要一些反射逻辑。



查看完整回答
反对 回复 2022-10-15
?
心有法竹

TA贡献1866条经验 获得超5个赞

这就是我最终的结果,它完全按照我想要Required的方式工作。


[AttributeUsage(AttributeTargets.Property)]

public class DictionaryRequiredAttribute : ValidationAttribute

{

    public DictionaryRequiredAttribute() : base(() => "The {0} field is required and cannot contain null values.") { }


    public override bool IsValid(object value)

    {

        if (value == null)

        {

            return false;

        }


        if (value is IDictionary dictValue)

        {

            foreach (var key in dictValue.Keys)

            {

                if (dictValue[key] == null)

                {

                    return false;

                }

            }

        }


        return true;

    }

}

主要是根据这里RequiredAttribute找到的执行。


查看完整回答
反对 回复 2022-10-15
  • 2 回答
  • 0 关注
  • 117 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信