[英]How can I use reflection to dynamically cast one object to another?
我正在尝试设置以下代码:
控制器
[HttpGet]
public ActionResult LoadReport(string actionName, string reportInput, string reportCriteria)
{
var type = Assembly.Load("Company.TaxCollection.Reports").GetTypes().First(t => t.Name == reportInput);
var typeCriteria = Assembly.Load("Company.TaxCollection.Reports").GetTypes().First(t => t.Name == reportInput + "Criteria");
var reportObject = Activator.CreateInstance(type);
var reportObjectCriteria = Activator.CreateInstance(typeCriteria);
IEnumerable<ReportCriteria> reportList = getReportCriteria(reportObject);
foreach (ReportCriteria r in reportList)
{
reportObjectCriteria t = (reportObjectCriteria)r;
}
return Json(Url.Action(actionName, "Reports", reportList.Where(x => x.CriteriaName == reportCriteria)));
}
我得到错误reportObjectCriteria is a variable but is used like a type
在 foreach 循环中reportObjectCriteria is a variable but is used like a type
。
我也试过不使用变量而直接使用 Activator.CreateInstance,但这也不起作用。
foreach (ReportCriteria r in reportList)
{
Activator.CreateInstance(typeCriteria) t =
(Activator.CreateInstance(typeCriteria)) r;
}
这些代码行的目的是在运行时动态地将 ReportCriteria 对象转换为另一种类型。 要转换到的对象类型由控制器中的 reportInput 参数决定。
只要您不在运行时动态加载 .dll,我建议您使用Automapper 之类的库。 您可以创建多个映射,如下所示,并使用条件逻辑来确定要映射到的类型。
var config = new MapperConfiguration(cfg => {
cfg.CreateMap<SourceType, DestType1>();
cfg.CreateMap<SourceType, DestType2>();
cfg.CreateMap<SourceType, DestType3>();
});
DestType1 dt1 = mapper.Map<DestType1>(sourceTypeInstance);
DestType2 dt2 = mapper.Map<DestType2>(sourceTypeInstance);
DestType3 dt3 = mapper.Map<DestType3>(sourceTypeInstance);
该库功能非常丰富,您可以在其中配置映射到更深层次和列表/数组等。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.