public virtual T SaveWindowControls(StackPanel control, string name, Type type, object[] attributes) { try { //create instance of type here; object always starts null? T obj = (T)ReflectionExt.CreateMinimalInstance(type); List <MemberInfo> myFields = type.GetEditableMembers(); List <List <MemberInfo> > tieredFields = new List <List <MemberInfo> >(); for (int ii = 0; ii < myFields.Count; ii++) { if (myFields[ii].GetCustomAttributes(typeof(NonEditedAttribute), false).Length > 0) { continue; } if (myFields[ii].GetCustomAttributes(typeof(NonSerializedAttribute), false).Length > 0) { continue; } object member = myFields[ii].GetValue(obj); if (member == null && myFields[ii].GetCustomAttributes(typeof(NonNullAttribute), false).Length > 0) { throw new Exception("Null class member found in " + type.ToString() + ": " + myFields[ii].Name); } if (myFields[ii].GetCustomAttributes(typeof(SharedRowAttribute), false).Length == 0) { tieredFields.Add(new List <MemberInfo>()); } tieredFields[tieredFields.Count - 1].Add(myFields[ii]); } int controlIndex = 0; for (int ii = 0; ii < tieredFields.Count; ii++) { if (tieredFields[ii].Count == 1) { MemberInfo myInfo = tieredFields[ii][0]; object member = DataEditor.SaveMemberControl(obj, (StackPanel)control.Children[controlIndex], myInfo.Name, myInfo.GetMemberInfoType(), myInfo.GetCustomAttributes(false), false); myInfo.SetValue(obj, member); controlIndex++; } else { Grid sharedRowControl = (Grid)control.Children[controlIndex]; int sharedRowControlIndex = 0; for (int jj = 0; jj < tieredFields[ii].Count; jj++) { MemberInfo myInfo = tieredFields[ii][jj]; object member = DataEditor.SaveMemberControl(obj, (StackPanel)sharedRowControl.Children[jj], myInfo.Name, myInfo.GetMemberInfoType(), myInfo.GetCustomAttributes(false), false); myInfo.SetValue(obj, member); sharedRowControlIndex++; } controlIndex++; } } return(obj); } catch (Exception e) { DiagManager.Instance.LogError(e); return(default(T)); } }