【问题标题】:Dynamically calculate average value no matter what type of values (integer, Timestamp, etc.)无论是什么类型的值(整数、时间戳等),都可以动态计算平均值
【发布时间】:2016-07-27 12:12:48
【问题描述】:

我有一个动态方法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() 扩展方法的类型?

【问题讨论】:

  • 您正在为列表中的每个项目调用转换方法,请考虑在开始迭代之前仅检查一次类型。

标签: c# reflection timestamp extension-methods


【解决方案1】:

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

【讨论】:

  • 非常感谢!我不知道为什么,但我并不担心
【解决方案2】:

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

例如:

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

您的sum.Average().ToString() 应该使用新的扩展名。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 2014-05-26
    • 1970-01-01
    • 1970-01-01
    • 2018-05-08
    • 1970-01-01
    相关资源
    最近更新 更多