繁体   English   中英

在 C# 中创建一个通用对象

[英]Create a Generic Object in C#

如何创建一个应该如下所示的类:

public class DynamicObject<T> 
{
   public T PassedObject { get;set; }
   string RepositoryMessage { get; set; } = string.Empty;
}

在我的存储库中,如果它从数据库中获得结果,我可以返回一个对象。 这应该放在 T 中。但是如果我没有得到任何结果,那么 T 应该是 null 并且 RepositoryMessage 应该有一条消息。 请参阅我的存储库示例代码

public async Task<DynamicObject<UserModel>> GetUser(SomeObject object) 
{
   UserModel um = new UserModel();
   DynamicOBject do = new DynamicObject<UserModel>();
   DB CALLS HERE....
   var responseCode = cmd.Parameters["@ResponseCode"].Value
   var responseMessage = cmd.Parameters["@ResponseCode"].Value
   if (response == 0) 
   {
     ....
     um.FName = reader.GetString(0);
     um.LName = reader.GetString(1);
     // The DynamicObject should now look like this:
     PassedValue = UseModel and the RepositoryMessage = string.Empty
     ....
   } else {
     do.PassedObject = null;
     do.RepositoryMessage = responseMessage;
     // The DynamicObject should now look like this:
     PassedValue = null and the RepositoryMessage = WHATEVER the responseMessage is from the SP.
   }
   return do;
}

我不知道是否有现有的技术。 但这是我认为我可以获得数据库消息并将其传递给控制器​​并通过这样的错误将其传递给客户端的唯一方法 => return BadRequest(respository.RepositoryMessage);

谢谢你。

编辑:

我不知道这是正确的还是标准的做法,但这就是我想出的:

public class GenericResponse<T>
{
    public string RepositoryMessage { get; set; } = string.Empty;
    public T? ModelToReturn { get; set; }
}

public async Task<GenericResponse<ApplicationUser>> AuthenticateUser(UserLoginModel model)
{
    ApplicationUser user = new ApplicationUser();
    GenericResponse<ApplicationUser> response = new GenericResponse<ApplicationUser>();
    try
    {
        using (_connection = new SqlConnection(_helper.GetConnectionString()))
        {
            using(var cmd = _connection.CreateCommand())
            {
                cmd.CommandText = "UserLogin";
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.CommandTimeout = _helper.GetCommandTimeout();

                var pUserName = new SqlParameter
                {
                    ParameterName = "@UserName",
                    DbType = DbType.String,
                    Size = 20,
                    Direction = ParameterDirection.Input,
                    Value = model.UserName
                };
                cmd.Parameters.Add(pUserName);

                var pPassword = new SqlParameter
                {
                    ParameterName = "@Password",
                    DbType = DbType.String,
                    Size = 35,
                    Direction = ParameterDirection.Input,
                    Value = model.Password
                };
                cmd.Parameters.Add(pPassword);

                var pResponseCode = new SqlParameter
                {
                    ParameterName = "@ResponseCode",
                    DbType = DbType.Int16,
                    Direction = ParameterDirection.Output,
                };
                cmd.Parameters.Add(pResponseCode);

                var pResponseMessage = new SqlParameter
                {
                    ParameterName = "@ResponseMessage",
                    DbType = DbType.String,
                    Size = 75,
                    Direction = ParameterDirection.Output,
                };
                cmd.Parameters.Add(pResponseMessage);

                await _connection.OpenAsync();
                cmd.ExecuteNonQuery();

                var responseCode = int.Parse(cmd.Parameters["@ResponseCode"].Value.ToString());
                var responseMessage = cmd.Parameters["@ResponseMessage"].Value.ToString();

                if (responseCode == 0)
                {
                    using (var reader = cmd.ExecuteReader())
                    {
                        while(reader.Read())
                        {
                            user.FirstName = reader.GetString(0);
                            user.LastName = reader.GetString(1);
                            user.UserRole = reader.GetString(2);
                        }
                    }
                    response.ModelToReturn = user;
                    response.RepositoryMessage = string.Empty;
                } else
                {
                    response.ModelToReturn = user;
                    response.RepositoryMessage = responseMessage;
                }
            }
        }
    }
    catch (Exception ex)
    {
        _helper.LogErrorMessage(ex.StackTrace, Models.LoggerModel.LoggingType.Error);
        response.ModelToReturn = user;
        response.RepositoryMessage = "An error has occured in loggin in";
    }
    return response;
}

我不确定是否有一般规则,但我在Cotroller中使用:

return StatusCode(result.StatusCode, result.Data);

对于一个好的查询,状态码200只返回数据。

基于 validate 或使用try catch进行查询,我返回最佳匹配状态, Data now 作为错误消息,而不仅仅是BadRequest

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM