繁体   English   中英

如何使用反射将一个对象动态转换为另一个对象?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM