private static JArray CustomizeSubmodelElement(ISubmodelElement element, string[] columns) { JArray jArray = new JArray(); Type elementType = element.GetType(); List <PropertyInfo> propertyInfos = elementType.GetProperties(BindingFlags.Public | BindingFlags.Instance).ToList(); JObject jObj = new JObject(); if (element.ModelType == ModelType.SubmodelElementCollection) { var valueContainer = element as SubmodelElementCollection; foreach (var subElement in valueContainer.Value) { JArray subJArray = CustomizeSubmodelElement(subElement, columns); jArray.Merge(subJArray, new JsonMergeSettings() { MergeArrayHandling = MergeArrayHandling.Union }); } } else { foreach (var column in columns) { var info = propertyInfos.Find(p => p.Name == column.UppercaseFirst()); if (info != null) { var value = info.GetValue(element); if (value != null) { jObj.Add(column, JToken.FromObject(value)); } } } } if (jObj.HasValues) { jArray.Add(jObj); } return(jArray); }