Как использовать getValue из GetProperty, возвращенного из результата Task‹T›

Итак, мой вопрос: я хотел бы реорганизовать этот фрагмент кода. Мне нужно получить 3 значения, SpentTimeHours, RemainingTimeHours и InitialEffortEstimateHours, которые имеют значение nullable double (double?). Эти значения должны поступать из кеша (словаря) или, если они не существуют из кеша, получить их из db (шаблон репозитория).

Значения из словаря работают нормально, проблема в том, чтобы получить значения из репозитория и использовать отражение. FindFirstOrDefaultAsync возвращает Task<T> объекта USTask

public partial class USTask
{
    public long Aid { get; set; }
    public Nullable<double> RemainingTimeHours { get; set; }
    public Nullable<double> SpentTimeHours { get; set; }
    public Nullable<double> InitialEffortEstimateHours { get; set; }
}

класс KpiService

 public double GetEstimatedStoryPoint(
            List<CrossReference> result,
            string propertyName,
            string pattern,
            long Aid,
            bool isCache,
            bool isUserStory = false)
        {

            if (!isCache)
            {
                double? value = 0;
                //ERROR - 
                value = _userStoryTaskRepository
                    .FindFirstOrDefaultAsync(id => id.Aid == ids.Aid)
                    .Result
                    .GetType()
                    .GetProperty(propertyName)
                    .GetValue(value , null) as double?;
            }
            else
            {
                //Working fine
                value = GetValuesForEstimatedStoryPoint(GraphTable._USTask, propertyName, ids.Aid);
            }
......

в KpiVieModel.cs

Я внедряю kpiService в конструктор и вызываю так, я передаю 3 propertyName как параметр SpentTimeHours, RemainingTimeHours, InitialEffortEstimateHours

тогда я звоню так

// This Work
//In cache
sumSpentTime += _kpiService.GetEstimatedStoryPoint(crosReferenceInCache, "SpentTimeHours", pattern, Aid, true, isUserStory);
sumRemainigTime += _kpiService.GetEstimatedStoryPoint(crosReferenceInCache, "RemainingTimeHours", pattern, Aid, true, isUserStory);
sumEstimated += _kpiService.GetEstimatedStoryPoint(crosReferenceInCache, "InitialEffortEstimateHours", pattern, Aid, true, isUserStory);


This not..
//not in cache , db access 
sumSpentTime += _kpiService.GetEstimatedStoryPoint(crosReferenceNotInCache, "SpentTimeHours", pattern, Aid, false, isUserStory);
sumRemainigTime += _kpiService.GetEstimatedStoryPoint(crosReferenceNotInCache, "RemainingTimeHours", pattern, Aid, false, isUserStory);
sumEstimated += _kpiService.GetEstimatedStoryPoint(crosReferenceNotInCache, "InitialEffortEstimateHours", pattern, Aid, false, isUserStory);

Проблема в том, что объект не соответствует типу целевого источника.

Я не хочу делать это n раз.

SpentTimeHours = _userStoryTaskRepository.FindFirstOrDefaultAsync(id => id.Aid == ids.Aid).Result.SpentTimeHours;
RemainingTimeHours = _userStoryTaskRepository.FindFirstOrDefaultAsync(id => id.Aid == ids.Aid).Result.RemainingTimeHours;
InitialEffortEstimateHours = _userStoryTaskRepository.FindFirstOrDefaultAsync(id => id.Aid == ids.Aid).Result.InitialEffortEstimateHours;

person jolynice    schedule 17.02.2017    source источник
comment
Что такое foundA? Разве вам не нужно присваивать переменную Result, а затем передавать ее в GetValue?   -  person Quantic    schedule 18.02.2017
comment
Привет, Quantic, извините за неудачное копирование и вставку, FoundA не существует, мне действительно нужно передать значение результата в значение переменной.   -  person jolynice    schedule 18.02.2017
comment
Это должно быть 2 шага, я уверен: var myObject = _userStoryTaskRepository.FindFirstOrDefaultAsync(id => id.Aid == ids.Aid).Result; value = myObject.GetType().GetProperty(propertyName).GetValue(myObject, null) as double?;   -  person Quantic    schedule 18.02.2017
comment
Пятизвездочный Quantic, работает, я чувствую себя так глупо, это было так просто, спасибо.   -  person jolynice    schedule 18.02.2017


Ответы (1)


Поправьте меня, если я ошибаюсь. Вы хотите улучшить результаты null в этом случае? Если это так, я буду обрабатывать null с помощью объединяющего null оператора, например в следующем:

sumSpentTime += _kpiService.GetEstimatedStoryPoint(crosReferenceNotInCache, "SpentTimeHours", pattern, Aid, false, isUserStory) ?? 0;
sumRemainigTime += _kpiService.GetEstimatedStoryPoint(crosReferenceNotInCache, "RemainingTimeHours", pattern, Aid, false, isUserStory) ?? 0;
sumEstimated += _kpiService.GetEstimatedStoryPoint(crosReferenceNotInCache, "InitialEffortEstimateHours", pattern, Aid, false, isUserStory) ?? 0; 
person kat1330    schedule 17.02.2017
comment
Здравствуйте Kat1330, ваш ответ тоже правильный, спасибо. - person jolynice; 18.02.2017