[英]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.