Преобразование конкретного типа реализации в общий c тип интерфейса - PullRequest
1 голос
/ 09 июля 2020

У меня есть такие интерфейсы и реализации:

public interface IRequest
{
   string Name{set;get;}
}

public class UppercaseRequest: IRequest
{
    public string Name{get; set}
}

public interface IHandler<T> where T: IRequest
{
   void Handle(T request);
}

public class UpperCaseHandler : IHandler<UpperCaseRequest>
{
     //implementation interface here
}

И фабрика, подобная этой:

public class HandlerFactory
{
    public IHandler<T> CreateHandler(T request) where T: IRequest
    {
       switch(request.Name)
       {
         case "UpperCase": return new UpperCaseHandler() as IHandler<T>;
                           //this line compile but always return null;
       }
    }
}

Этот метод обработчика в HandlerFactory всегда возвращает null. Что я делаю не так и как исправить такое поведение? Не могли бы вы также дать мне совет, как я могу улучшить структуру кода?

1 Ответ

0 голосов
/ 09 июля 2020

Вот модифицированный и исправленный код, который работает как шарм. У нас есть ссылка на экземпляр. Но я не знаю, хотите ли вы ...

Класс фабрики должен быть c, не так ли?

введите описание изображения здесь

static void Test()
{
  var a = new HandlerFactory().CreateHandler(new UpperCaseRequest() { Name = "UpperCase" });
}
public class HandlerFactory
{
  public IHandler<T> CreateHandler<T>(T request) where T : IRequest
  {
    switch ( request.Name )
    {
      case "UpperCase": return new UpperCaseHandler() as IHandler<T>;
    }
    return default(IHandler<T>);
  }
}

public interface IRequest
{
  string Name { set; get; }
}

public class UpperCaseRequest : IRequest
{
  public string Name { get; set; }
}

public interface IHandler<T> where T : IRequest
{
  void Handle(T request);
}

public class UpperCaseHandler : IHandler<UpperCaseRequest>
{
  public void Handle(UpperCaseRequest request)
  {
    throw new NotImplementedException();
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...