класс ответа с общим

#c# #generics

#c# #общие

Вопрос:

Извините, если об этом спрашивали раньше, но я не могу его найти, и я не совсем уверен, что искать.

У меня есть общий класс ответов, подобный этому:

  public class ResponseModel<T>
{
    public T Data { get; set; }
    public Exception Ex { get; set; }
    public string Message { get; set; }
    public bool Success { get; set; }
}
  

Я хотел бы сделать что-то вроде приведенного ниже кода, чтобы я мог просто передавать ошибки вверх по стеку, выполняя return retVal.Set<T>(responseModelObject);

     public ResponseModel<T> Set<T>(ResponseModel<T> rm)
    {
        Ex = rm.Ex;
        Message = rm.Message;
        return this;
    }
  

Это отлично работает, если T класс идентичен между retVal и responseModelObject , но не будет компилироваться, если они не совпадают.

Есть ли способ сделать это или я просто sol?

Комментарии:

1. Я бы рекомендовал взглянуть на существующие примеры решения такого рода проблем, поскольку объект ответа / результата является довольно хорошо известным шаблоном, например: github.com/altmann/FluentResults

2. Спасибо. Я буду читать об этом.

Ответ №1:

Вы можете создать интерфейс

 public interface IResponseModel
{
    Exception Ex { get; set; }
    string Message { get; set; }
    bool Success { get; set; }
}

public class ResponseModel<T> : IResponseModel
{
    public T Data { get; set; }
    public Exception Ex { get; set; }
    public string Message { get; set; }
    public bool Success { get; set; }
}
  

Тогда метод будет выглядеть следующим образом

 public ResponseModel<T> Set(IResponseModel rm)
{
    Ex = rm.Ex;
    Message = rm.Message;
    return this;
}
  

Также интерфейс позволит вам создавать коллекции IResponseModel , которые могут содержать обобщения разных типов. Это может быть также полезно async Task<IResponseModel> для таких операций, как и т.д.

Комментарии:

1. Спасибо. Это, вероятно, тоже сработало бы, но сначала я согласился с предложением Дмитрия, и оно работает. Тем не менее, я очень признателен.

2. На самом деле я изменил свой код, чтобы использовать ваш ответ. Это лучше. Спасибо. Теперь мне не нужно передавать класс входящего объекта.

Ответ №2:

Вы могли бы попытаться объявить метод как:

 public ResponseModel<T> Set<TOther>(ResponseModel<TOther> rm)
{
    Ex = rm.Ex;
    Message = rm.Message;
    return this;
}
  

Пример использования:

 ResponseModel<int> a = new ResponseModel<int>();
ResponseModel<string> b = new ResponseModel<string>();
b.Set(a); // It compiles
  

Ответ №3:

Это работает?

 public ResponseModel<T,S> Set<S>(ResponseModel<T> rm)
{
    Ex = rm.Ex;
    Message = rm.Message;
    return this;
}
  

Комментарии:

1. Нет, но это была хорошая попытка. Я также пробовал ResponseModel<T> Set<S>(responsemodel<T> rm), а также ResponseModel<T> Set<T>(ResponseModel<S>), но безуспешно. Второй вариант сработал, за исключением того, что я не смог выполнить «return this» в конце.