Как я могу использовать отражение для динамического приведения одного объекта к другому? - PullRequest
0 голосов
/ 06 марта 2020

Я пытаюсь настроить следующий код:

Контроллер

[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 l oop.

Я также пытался не использовать переменную и просто использовать Activator.CreateInstance напрямую, но это тоже не сработало.

foreach (ReportCriteria r in reportList)
{
Activator.CreateInstance(typeCriteria) t = 
(Activator.CreateInstance(typeCriteria)) r;
}

Цель этих строк кода - привести Объект ReportCriteria динамически передается другому типу во время выполнения. Тип объекта для преобразования определяется параметром reportInput в контроллере.

1 Ответ

0 голосов
/ 06 марта 2020

Пока вы не загружаете .dll динамически во время выполнения, я бы рекомендовал использовать такую ​​библиотеку, как Automapper . Вы можете создать несколько сопоставлений, как показано ниже, и использовать условную логику c, чтобы определить, к какому типу сопоставляться.

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

Библиотека очень многофункциональна, где вы можете настроить сопоставления на более глубокие уровни и списки / массивы et c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...