コード例 #1
0
        /// <summary>
        ///   Attempts to create a distribution's property. If the property doesn't
        ///   qualify as a valid property to be shown in the automatic distribution
        ///   description, the method fails and returns false.
        /// </summary>
        /// 
        /// <param name="info">The property's reflection information.</param>
        /// <param name="owner">The distribution that should own this property.</param>
        /// <param name="property">The created distribution property.</param>
        /// 
        /// <returns>True if the property could be created; false otherwise.</returns>
        /// 
        public static bool TryParse(PropertyInfo info, DistributionViewModel owner, out PropertyViewModel property)
        {
            property = null;

            if (info.GetMethod.ReturnType != typeof(double))
                return false;

            property = new PropertyViewModel(info, owner);

            return true;
        }
コード例 #2
0
        /// <summary>
        /// Attempts to create a new DistributionViewModel from a given type.
        /// </summary>
        public static bool TryParse(MainViewModel owner, Type type, Dictionary <string, DocumentationViewModel> doc, out DistributionViewModel distribution)
        {
            distribution = new DistributionViewModel(owner);

            if (!typeof(IUnivariateDistribution).IsAssignableFrom(type) || !doc.ContainsKey(type.Name))
            {
                return(false);
            }


            string name = DistributionManager.GetDistributionName(type);


            // Extract all properties with return value of double
            //
            var properties = new List <PropertyViewModel>();

            foreach (PropertyInfo prop in type.GetProperties())
            {
                PropertyViewModel property;
                if (PropertyViewModel.TryParse(prop, distribution, out property))
                {
                    properties.Add(property);
                }
            }

            // Extract buildable constructors. A constructor is
            // considered buildable if we can extract valid ranges
            // and default values from all of its parameters
            //
            var list = new List <ConstructorViewModel>();

            foreach (var ctor in type.GetConstructors())
            {
                ConstructorViewModel constructor;
                if (ConstructorViewModel.TryParse(ctor, distribution, out constructor))
                {
                    list.Add(constructor);
                }
            }

            if (list.Count == 0)
            {
                return(false);
            }

            // For the time being, just consider the buildable
            // constructor with the largest number of parameters.
            //
            var main = list.OrderByDescending(x => x.Parameters.Count).First();



            // Extract some documentation
            var documentation = doc[type.Name];

            documentation.Name = name;

            distribution.Constructor   = main;
            distribution.Properties    = new ObservableCollection <PropertyViewModel>(properties);
            distribution.Parameters    = main.Parameters;
            distribution.Type          = type;
            distribution.Name          = name;
            distribution.Documentation = documentation;


            foreach (var parameter in distribution.Constructor.Parameters)
            {
                parameter.ValueChanged += distribution.distribution_OnParameterChanged;
            }

            distribution.Options = DistributionManager.GetFittingOptions(distribution.Type);

            return(true);
        }