处理用户尝试在 C# 中添加具有重复 ID 错误的新用户

Handling User tries to add a new user with a duplicate id error in c#

我正在尝试创建用户定义的函数来处理用户尝试添加具有重复 ID 的新用户

我创建了这个:

public class DuplicateIdException:Exception
{
    public DuplicateIdException(String message) : base(message)
    {

    }
    public override string Message => $" --- {base.Message} --- ";
}

public class TestDuplicateIdException
{

    static void validate(List<Object> Users)
    {
        bool flag = false;
        Type DataType = Users[0].GetType();
        List<DataType> UsersConverter = Users.Cast<DataType>().ToList();
        flag = UsersConverter.Any(x => x.Id == Id);
        if (flag)
        {
            throw new DuplicateIdException("Sorry, You duplicate the Id");
        }
    }
}

我有很多对象类型,它们都有 Id 属性,但是当我调用 object.Id 时它给出了错误并且无法正常工作。那么我如何检查它们并完成异常?

您可以为所有具有 id 的 class 创建一个基础 class,如果需要,它可以是一个接口或基础 class。

public class EntityBase
{
    public int Id { get; set; }
}

然后inherit/implement它

public class Users : EntityBase
{
    
}
public class Order : EntityBase
{

}

然后用基数验证class/interface

public class ValidateDuplidateId
{
    static void Validate(IEnumerable<EntityBase> entities,int id)
    {
        if (entities.Any(x => x.Id == id))
            throw new Exception("Duplicate Id Found");
    }
}

我不喜欢这种抛出异常来处理业务逻辑错误的方法,对我来说更好的方法是这样的

public class Validator
{
    public static bool IsDuplicateId(IEnumerable<EntityBase> entities,int id)
    {
        if (entities.Any(x => x.Id == id))
          return  true;
        return false;
    }
}

然后我将添加一个通用的操作结果class来处理任何类型的对象

public class OperationReuslt<T>
{
    public T Result { get; set; }
    public bool Success { get; set; }
    public string Message { get; set; }
}

在我的用户服务中(例如)

 public class UserSerivce
{
    public OperationReuslt<Users>AddUser(int id)
    {
        //replace this with data from your actual data source
        List<Users> users = new List<Users>();

        if(Validator.IsDuplicateId(users,id))
        {
            return new OperationReuslt<Users>
            {
                Success = false,
                Message = "Duplicate UserId"
            };
        }
        // else proceed 
    }
}

您可以使用这种方法,因为它更具可读性,并且没有像抛出异常方法那样的性能缺陷,但最终这一切都取决于您的情况