将基类转换为T的泛型类

时间:2019-12-04 09:06:20

标签: c# asp.net asp.net-mvc reflection

我有一个称为Event的基类,该基类由称为RequestModel的通用类类型继承,现在我必须在不知道请求模型中“ T”类型的情况下将基类对象转换为派生类。以下是我所做的事情。预先感谢您的帮助。

public class RequestModel<T>:Event
{
    public Guid Id { get; set; }
    public T Model{ get; set; }
    public string IpAddress { get; set; }
    public string EntityType => typeof(T).ToString();

    public override Type RequestEntityType { get { return typeof(T); }}
    public UserDataViewModel UserData { get; set; }
    public string Url { get; set; }
    public DateTime LogDate { get; set; }

    public RequestModel()
    {
        Id = Guid.NewGuid();
    }
}

public abstract class Event
{
    public abstract Type RequestEntityType { get; }
}

我有事件类的集合,我在其中添加了RequestModel

public List<Event> AllEvents = new List<Event>();

这是我从集合中取出每个事件的功能

public void RunLogEvent()
{
    foreach (var eventItem in AllEvents)
    {
        try
        {
            var mappedData = MapData(eventItem);
            _creditCardLogService.Add(mappedData);
        }
        catch (Exception ex)
        {
            continue;
        }
    }
    _unitOfWork.Commit();
}

这是MapData函数,在这里我实际上需要将事件对象转换为RequestModel对象的类型转换

private CreditCardLog MapData(Event request)
{
    var b = Activator.CreateInstance(request.RequestEntityType);
    var a = CastToMyType(b, request);

    var serializer = new JavaScriptSerializer();
    var returnData = new CreditCardLog()
    {
        AppraisalFormID = ApparisalId,
        CreatedBy =null ,
        CreatedDate = a.LogDate,
        LogID = a.Id,
        Data = serializer.Serialize(a.Model)
    };
    //return returnData;
    return returnData;
}

public  RequestModel<T> CastToMyType<T>(T NeededType, object givenObject) where T : class
{
    var newObject = givenObject as RequestModel<T>;
    return newObject;
}

最后一个函数CastToMyType<T>是强制转换对象,我迫切需要将对象强制转换为RequestModel<T>类型,而我现在无法做到这一点,如果有人可以帮助的话,那就太好了。谢谢。

2 个答案:

答案 0 :(得分:1)

您可以在RequestModel类的T模型中设置事件类列表,因为它是通用类型。

public class RequestModel<T>
{
    public Guid Id { get; set; }
    public T Model { get; set; }
    public string IpAddress { get; set; }
    public string Url { get; set; }
    public DateTime LogDate { get; set; }
    public RequestModel()
    {
        Id = Guid.NewGuid();
    }
}

现在定义您可以在其中记录事件的功能。

public void LogEvent(RequestModel<List<Event>> request)
{
    foreach (var eventItem in request.Model)
    {
        try
        {
            var logData = new CreditCardLog()
            {
                AppraisalFormID = ApparisalId,
                CreatedBy = "UserID",
                CreatedDate = request.LogDate,
                LogID = Guid.NewGuid(),
                Data = new JavaScriptSerializer().Serialize(eventItem)
            };
            _creditCardLogService.Add(logData);
        }
        catch (Exception ex)
        {
            continue;
        }
    }
}

要将模型转换为RequestModel,还可以创建扩展方法。

public static RequestModel<T> ToRequestModel<T>(this T model)
{
    return new RequestModel<T>()
    {
        Id = Guid.NewGuid(),
        Model = model
        // assign other property value
    };
}

现在,您可以通过调用ToRequestModel方法将事件列表转换为RequestModel。

List<Event> ev = new List<Event>();
var request = ev.ToRequestModel();
LogEvent(request);

此外,如果有不同类型的Event,则应继承那些Event类中的抽象Event类,而不是RequestModel类。

答案 1 :(得分:-1)

您可以通过反射调用方法。

MethodInfo method = typeof(Example).GetMethod("CastToMyType");
MethodInfo generic = method.MakeGenericMethod(e.RequestEntityType);
generic.Invoke(this, new object[] { e.RequestEntityType, e });

请参见fiddle