2016-07-27 8 views
0

У меня есть динамический метод 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() расширение способ?

+0

Вы вызываете метод преобразования для каждого элемента в списке, рассмотрите возможность проверки типа только один раз перед началом итерации. – Sinatr

ответ

1

Вы можете написать собственный Способ расширения ->Extension methods. Просто введите метод расширения для TimeStamp.

+0

Большое спасибо! Я не знаю почему, но я не беспокоился о том, что – rbr94

1

Как насчет написания собственных расширений для типов, для которых требуется Среднее значение.

Например:

private static string Average(this ClassYouWantaAverageFor foo) 
{ 
    // calculate the average 
    return "average"; 
} 

Ваш sum.Average().ToString() должен принять новое расширение.