static StringTable Format_Table_Version_3(Unit rootUnit, string[] fields, string orderBy) { var fieldsToLower = fields.Select(s => s.ToLowerInvariant()).ToList(); IEnumerable <string> fieldNames = fields; List <IPropertyDescriptor> selectedProperties; if (fieldsToLower.Contains("*") || fieldsToLower.Contains("all")) { if (fieldsToLower.Count > 1) { selectedProperties = lowerCaseNameToProperty.OrderBy(kvp => fieldsToLower.IndexOf(kvp.Key)).Select(kvp => kvp.Value).ToList(); } else { selectedProperties = allProperties; } fieldNames = selectedProperties.Select(p => p.Name); } else { selectedProperties = new List <IPropertyDescriptor>(); for (int i = 0; i < fields.Length; i++) { var prop = GetOneProperty(fieldsToLower[i]); if (prop != null) { selectedProperties.Add(prop); } else { throw new Exception($"field {fields[i]} was not found in {typeof(Person)}, possible field values are:\n{allPropertiesNames}"); } } } var data = new StringTable(); foreach (var f in fieldNames) { data.AddColumn(f); } var people = rootUnit.GetAllActivePeople(); IEnumerable <Person> persons = people; if (orderBy == "id") { persons = people.OrderBy(p => p.PersonId); } foreach (var person in persons) { var row = data.NewRow(); foreach (var p in selectedProperties) { var val = p.Read(person); row.Add(val == null ? string.Empty : val.ToString()); } data.AddRow(row); } return(data); }