c# - 将基类转换为 T 的泛型类
问题描述
我有一个名为 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>
我现在无法这样做的类型,如果有人可以提供帮助,那就太好了。谢谢你。
解决方案
您可以在 RequestModel 类的 T 模型中设置 Event 类列表,因为它是泛型类型。
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 类。
推荐阅读
- android - 受暗模式android影响的色调图像视图
- java - 如何通过扩展 Thread 类来同步 Java 中的两个线程?
- python - 检查文件是否已写入或被另一个进程使用
- sql - 如何在 SQL 中计算联接表上的行数?
- python-3.x - 如何以编程方式将 Ned Batchelder 的脚本用于 McCabe 的复杂性?
- pandas - 首先“分组”,然后从熊猫中绘制/保存为 png
- angular - Angular 中的 *ngIf 指令
- ios - 将视图用作 inputAccessoryView 时如何防止键盘添加自己的高度约束
- python-3.x - request.get(url) 的输出看起来像 dict 但说它是一个字符串
- ionic-framework - 如何在 Ionic Appflow 中添加构建阶段运行脚本阶段