动态计算平均值,无论什么类型的值(整数、时间戳等)
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()
应该使用新的分机号。
我有一个动态方法 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()
应该使用新的分机号。