Как вывести тип класса и затем присвоить значения во время выполнения в C#? - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть интерфейс, как показано ниже:

public interface IRequest
{
    Guid RequestUId { get; set; }
    TicketSystemTypeEnum TicketSystemType { get; set; }
}

, который реализуется классами Request, DeskPro, ServiceNow, как показано ниже:

public class Request : IRequest
{
    public Guid RequestUId { get; set; }
    public Guid RequestId { get; set; }
    public Guid RequestResourceId { get; set; }
    public string RequestCreator { get; set; }
    public DateTime CreatedDate { get; set; }
    public List<Task> Tasks { get; set; }
    public TicketSystemTypeEnum TicketSystemType { get; set; }
    public StatusEnum Status { get; set; }
}

public class DeskPro : IRequest
{
    public Guid RequestUId { get; set; }
    public Guid TicketId { get; set; }
    public Guid EmployeeId { get; set; }
    public DateTime DateCreated { get; set; }
    public List<Task> Tasks { get; set; }
    public TicketSystemTypeEnum TicketSystemType { get; set; }
    public StatusEnum TicketStatus { get; set; }
}

public class ServiceNow : IRequest
{
    public Guid RequestUId { get; set; }
    public Guid TicketNumber { get; set; }
    public Guid EmployeeNumber { get; set; }
    public DateTime CreatedOn { get; set; }
    public List<Task> Tasks { get; set; }
    public TicketSystemTypeEnum TicketSystemType { get; set; }
    public StatusEnum TicketPosition { get; set; }
}

Теперь данные из объекта Request должны быть отправлены в DeskPro и ServiceNow в их соответствующем формате. Для чего используются картографы. Опять же, чтобы получить соответствующую систему тикетов, используется фабричный метод.

    private IRequest mappedData;
    public IRequest GetMappedData(Request request)
    {
        IRequest requestedProduct = RequestFactory.CreateRequestFactory(request.TicketSystemType);
        requestedProduct.RequestUId = request.RequestUId;
        ***requestedProduct.TicketId = request.RequestId;
        requestedProduct.EmployeeId = request.RequestResourceId;
        requestedProduct.DateCreated = request.CreatedDate;
        requestedProduct.TicketStatus = request.Status;***
        requestedProduct.TicketSystemType = request.TicketSystemType;
        return mappedData;
    }

public abstract class RequestFactory
{
    public static IRequest CreateRequestFactory(TicketSystemTypeEnum ticketSystemTypeEnum)
    {
        switch(ticketSystemTypeEnum)
        {
            case TicketSystemTypeEnum.DeskPro:
                return new DeskPro();
            case TicketSystemTypeEnum.ServiceNow:
                return new ServiceNow();
            default:
                return null;
        }
    }
}

Однако я получаю ошибку в методе отображения - GetMappedData () - между тремя ***. Это снова очевидно, потому что наш IRequest не имеет всех этих полей. Итак, как мы можем решить эту проблему - что на основе моего типа объекта, этот объект может быть создан. Кроме того, если нужно избегать лестницы.

1 Ответ

0 голосов
/ 25 февраля 2020

вы можете использовать is ключевое слово и затем приводить тип, но для этого требуется цепочка if-else, которая действительно ужасна

, чтобы лучше использовать полиморфизм в вашем коде ....

Я предлагаю следующее:

Определите другой интерфейс IRequestMapped или IMapped<T>, который должен выглядеть примерно так:

public interface IMapped<T>
{
   void LoadFrom(T otherType);
}

тогда ваши определения классов будут выглядеть так:

public class DeskPro : IRequest, IMapped<Request>
{
    public Guid RequestUId { get; set; }
    public Guid TicketId { get; set; }
    public Guid EmployeeId { get; set; }
    public DateTime DateCreated { get; set; }
    public List<Task> Tasks { get; set; }
    public TicketSystemTypeEnum TicketSystemType { get; set; }
    public StatusEnum TicketStatus { get; set; }
    public void LoadFrom(Request r)
    {
          //MAP FROM REQUEST
    }
}

public class ServiceNow : IRequest, IMapped<Request>
{
    public Guid RequestUId { get; set; }
    public Guid TicketNumber { get; set; }
    public Guid EmployeeNumber { get; set; }
    public DateTime CreatedOn { get; set; }
    public List<Task> Tasks { get; set; }
    public TicketSystemTypeEnum TicketSystemType { get; set; }
    public StatusEnum TicketPosition { get; set; }
    public void LoadFrom(Request r)
    {
          //MAP FROM REQUEST
    }
}

Если вам нужно повторно использовать ваш класс mapper, вы можете сделать свой интерфейс:

public interface IHasMapper<TMapper>
{
    TMapper GetMapper();
}
...