У меня есть динамический метод GetAverage()
с использованием отражения для вычисления среднего значения для списка строковых значений. Строковые значения динамически преобразуются в тип, определенный в ValueType
. Тип DataSet
содержит List<string>
:Динамически рассчитывать среднее значение независимо от того, какой тип значений (целое число, отметка времени и т. Д.)
public class AggregateController {
private List<DataSet> DataSets { get; set; }
private Type ValueType { get; set; }
public string GetAverage() {
dynamic sum = Activator.CreateInstance(this.ValueType);
this.DataSets.ForEach(x => {
sum += this.TransformInputValue(x[0]);
});
return sum.Average().ToString();
}
private dynamic TransformInputValue (string value) {
try {
var mI = this.ValueType.GetMethod("Parse", new Type[] { typeof(string) });
return (dynamic)mI.Invoke(this, new object[] { value });
} catch {
return null;
}
}
}
Этот метод делает все прекрасно, когда заданные значения числовые значения. Теперь я хочу добиться динамического вычисления средних значений для значений метки времени с помощью того же метода. Проблема заключается в том, что не существует никакого метода Average()
расширения для объектов TimeStamp, и я не имею в виду, чтобы дополнительно реализовать условие проверки значений временных меток, как это:
if (this.ValueType == typeof(TimeStamp)) {
//do stuff to calculate TimeStamp average.
} else {
return sum.Average().ToString();
}
Есть ли способ, чтобы динамически реагировать на типы, как TimeStamp
, которые имеют нет Average()
расширение способ?
Вы вызываете метод преобразования для каждого элемента в списке, рассмотрите возможность проверки типа только один раз перед началом итерации. – Sinatr