/// <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; }
/// <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); }