/// <summary> /// Parses a naming convention string. /// </summary> /// <param name="convention">The convention string like {[PropertyA.SubPropertyA...etc]}separator{[PropertyB.SubPropertyB...etc]}separator...{[PropertyN.SubPropertyN]}</param> /// <returns>Returns a naming convention structure.</returns> public static NamingConvention ParseNamingConvention(string convention) { var rx = new Regex(@"\{\[?(\w+\.?)*(?:\(\d\))?\]?\}"); var rxname = new Regex(@"(\w+\.?)+"); var rxoptional = new Regex(@"\[(\w+\.?)+(\(\d)?\)?\]"); var rxpadding = new Regex(@"\w+\((?<padding>\d)\)", RegexOptions.ExplicitCapture); var matches = rx.Matches(convention); NamingConvention nc = new NamingConvention(); // build format pattern from convention var pattern = convention; for (int index = 0; index < matches.Count; index++) { var match = matches[index].Value; // get match property NamingConventionProperty ncp = new NamingConventionProperty() { Name = rxname.Match(match).Value, IsOptional = rxoptional.IsMatch(match) }; if (rxpadding.IsMatch(match)) // get padding { Match paddingMatch = rxpadding.Match(match); var paddingstr = paddingMatch.Groups["padding"] != null ? paddingMatch.Groups["padding"].Value : string.Empty; int padding; int.TryParse(paddingstr, out padding); ncp.Padding = padding; } nc.Properties.Add(ncp); // add match placeholder to pattern var mrx = new Regex(Regex.Escape(match)); pattern = mrx.Replace(pattern, string.Format("{{{0}}}", index), 1); } nc.Pattern = pattern; return(nc); }
private static string GetFormattedValue(object value, NamingConventionProperty property) { if (value != null) { if (property.Padding > 0) // apply padding if possible { // check if number if (!value.GetType().IsAssignableFrom(typeof(int))) { throw new BusinessException( string.Format( "Failed to apply padding for property {0} because it is not integer type. Property type:{1} ", property.Name, value.GetType().Name)); } return(((int)value).ToString("D" + property.Padding.ToString())); } return(value.ToString()); } return(string.Empty); }