【发布时间】: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