/// <summary>
 /// Get the optimized objective from a permformance result
 /// </summary>
 bool GetResult(PerformanceMatrix r, out decimal result)
 {
     result = 0;
     if (_resultproperty == null)
     {
         foreach (var pr in r.GetType().GetProperties())
         {
             if (pr.Name == OptimizeDecisionsName)
             {
                 _resultproperty = pr;
                 break;
             }
         }
     }
     try
     {
         var o = _resultproperty.GetValue(r, null);
         result = (decimal)o;
         return(true);
     }
     catch (Exception ex)
     {
         Debug("error getting result from OptimizeDecision name: " + OptimizeDecisionsName + " err: " + ex.Message + ex.StackTrace);
     }
     return(false);
 }
        /// <summary>
        /// Get performance measure as optimization objective
        /// </summary>
        /// <returns></returns>
        public static List <string> GetDecideable()
        {
            List <string> dr = new List <string>();
            // Type r = typeof(PerformanceMatrix);
            PerformanceMatrix r = new PerformanceMatrix();

            foreach (var pi in r.GetType().GetProperties())
            {
                if (!pi.GetAccessors()[0].IsPublic)
                {
                    continue;
                }
                var pt = pi.PropertyType;
                if ((pt == typeof(decimal)) || (pt == typeof(int)))
                {
                    dr.Add(pi.Name);
                }
            }
            foreach (var pi in r.GetType().GetFields())
            {
                if (!pi.IsPublic)
                {
                    continue;
                }
                var pt = pi.FieldType;
                if ((pt == typeof(decimal)) || (pt == typeof(int)))
                {
                    dr.Add(pi.Name);
                }
            }
            var tmp = dr.ToArray();

            Array.Sort(tmp);
            return(new List <string>(tmp));
        }