如何推断类的类型,然后在运行时在C#中分配值?

问题描述 投票:0回答:1

我的界面如下:

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; }
}

现在,来自请求对象的数据必须以它们各自的格式发送到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没有所有这些字段。那么我们如何解决这个问题-根据我的对象类型,可以实例化该对象。另外,如果需要避免梯子。

c# asp.net asp.net-mvc-4 interface factory-pattern
1个回答
0
投票

您可以使用is keyword然后强制转换类型,但这需要is的链非常丑陋

为了更好地利用代码中的多态性。...

我建议这个:

定义另一个界面if-elseIRequestMapped,它应该大致如下:

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
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.