动态计算平均值,无论什么类型的值(整数、时间戳等)

Dynamically calculate average value no matter what type of values (integer, Timestamp, etc.)

我有一个动态方法 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;
        }
    }
}

当给定值为数值时,此方法可以完美地完成所有操作。现在我想用同样的方法动态计算时间戳值的平均值。问题是 TimeStamp 对象没有 Average() 扩展方法,我并不是要额外实现时间戳值的条件检查,如下所示:

if (this.ValueType == typeof(TimeStamp)) {
    //do stuff to calculate TimeStamp average.
} else {
    return sum.Average().ToString();
}

有没有一种方法可以对 TimeStamp 等没有 Average() 扩展方法的类型做出动态反应?

您可以编写自己的扩展方法 -> Extension methods。 只写TimeStamp的扩展方法。

如何为您想要平均值的类型编写自己的扩展。

例如:

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

您的 sum.Average().ToString() 应该使用新的分机号。