【问题标题】:Change value of property depending another in class根据类中的另一个更改属性值
【发布时间】:2023-01-06 23:24:30
【问题描述】:

我有一个名为 ValidationsResult 的类,它具有以下属性:

public class ValidationsResult
{
    public bool IsValid { get; set; }        

    public string[] Errors { get; set; }

    public void AddError(string error)
    {
        Errors.Append(error);
    }
}

但我希望属性 IsValid 是只读的,并且取决于对象是否有错误或不自动修改该属性。

我怎样才能做到这一点?

【问题讨论】:

  • 您是否使用过以下属性使用{get;set;} 语法?

标签: c#


【解决方案1】:

您可以通过不提供 set 块来使属性“只读”,并且如果 Errors 包含任何对象,您可以让它返回 true。下面我使用Any方法,如果集合有任何项目,它返回true,但我们还需要一个空检查(如果集合是null,则返回false)。最后,我将 Errors 更改为 List<string>,以便它可以随着项目的添加而动态增长,而不是具有固定大小的 string[]

public class ValidationsResult
{
    public bool IsValid
    {
        get
        {
            return Errors?.Any() ?? false;
        }
    }

    public List<string> Errors { get; set; } = new List<string>();

    public void AddError(string error)
    {
        Errors.Add(error);
    }
}

【讨论】:

    【解决方案2】:
    
    public class ValidationsResult
    {
        public bool IsValid { get => Errors != null && Errors.Length == 0; }  // no errors = valid      
    
        public string[] Errors { get; set; }
    
        public void AddError(string error)
        {
            Errors.Append(error);
        }
    }
    
    

    这将使它成为readonly,它会告诉你是否有错误

    根据评论,是的。如果您按照以下方式设计它会更好。

    
    public class ValidationsResult
    {
        public bool IsValid { get => Errors.Count == 0; }  // or !Errors.Any()      
    
        public List<string> Errors { get; } = new List<string>();
    
        public void AddError(string error)
        {
            Errors.Append(error);
        }
    }
    
    

    您初始化错误,但外部消费者仍然可以使用它。因此 - 下一次进化

    
    public class ValidationsResult
    {
        public List<string> _errors  = new List<string>();
    
        public bool IsValid { get => _errors.Count == 0; }  // or !Errors.Any()      
    
        public string[] Errors { get => _errors.ToArray(); }
    
        public void AddError(string error)
        {
            _errors.Append(error);
        }
    }
    
    

    【讨论】:

    • 关于 null 检查的要点。 (注意 OP)在尝试在 AddErrors 中使用它之前,您应该确保您正在初始化 Errors,并确保您使用的是可空引用类型功能。
    • 我还建议不要使用固定长度的数据结构,而是使用一个列表。
    • @Fildor 我添加了建议
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多