// 反射的经典实现,变量的反复抽象,把变化部分减少到最小,增强稳定部分,有利于扩展 private List<MatchPoint<float>> ployfitSeries(List<MatchPoint<int>> result, int LastNowDiff) { List<MatchPoint<float>> fitseries = new List<MatchPoint<float>>(); //在此反射数据系列,计算需要拟合的成员,由于输入和输出的数据类型不同,使用泛型<>,T PropertyInfo[] field = typeof(MatchPoint<>).GetProperties(); int size = result.Count(); var fisfilter = field.Where(e => e.Name == "LastMatchWDL" || e.Name == "LastMatchGoals" || e.Name == "LastMatchOddEven"); foreach (PropertyInfo fi in fisfilter) { double[] Y = new double[size]; double[] X = new double[size]; double[] X1 = new double[size]; for (int i = 0; i < size; i++) { //在此指定<>类型是整数 PropertyInfo fiIn = typeof(MatchPoint<int>).GetProperty(fi.Name); //反射获取值 Y[i] = Convert.ToDouble(fiIn.GetValue(result[i], null)); X[i] = Convert.ToDouble(result[i].LastMatchOverTime); if (i != size - 1) X1[i] = Convert.ToDouble(result[i + 1].LastMatchOverTime); else X1[i] = Convert.ToDouble(LastNowDiff); MatchPoint<float> f = new MatchPoint<float>(); f.LastMatchOverTime = (float)X1[i]; if (fitseries.Count == i) fitseries.Add(f); //如果累加就不行,这种方式,最大值不超过i } myCurveFitclass mmm = new myCurveFitclass(X, Y); mmm.CurvefitValue(LastNowDiff); //在此指定<>类型是小数 PropertyInfo fiOut = typeof(MatchPoint<float>).GetProperty(fi.Name); //这里改属性 //反射设定值 for (int j = 0; j < mmm.PredictionsNew.Length; j++) { fiOut.SetValue(fitseries[j], (float)mmm.PredictionsNew[j], null); } } return fitseries; }
public void initCurveFit() { if (Top20Count > 10) { CurveFit = ployfitSeries(ListMatchPointData, NowMatchTimeDiff); CurveFitValue = CurveFit.Last(); } }