private static object GetValue(Crate crate, string fieldKey) { if (crate.IsOfType <StandardTableDataCM>()) { var tableCrate = crate.Get <StandardTableDataCM>(); if (tableCrate.FirstRowHeaders && tableCrate.Table.Count > 1) { return(tableCrate.Table[1].Row.FirstOrDefault(a => a.Cell.Key == fieldKey)?.Cell?.Value); } } if (crate.IsKnownManifest) { var data = crate.Get(); object value = null; Fr8ReflectionHelper.VisitPropertiesRecursive(data, (instance, member) => { if (!member.CanRead) { return(Fr8ReflectionHelper.PropertiesVisitorOp.Continue); } var manifestAttr = member.GetCustomAttribute <ManifestFieldAttribute>(); if (manifestAttr != null && manifestAttr.IsHidden) { return(Fr8ReflectionHelper.PropertiesVisitorOp.Continue); } var tempValue = member.GetValue(instance); if (member.Name == fieldKey) { value = tempValue; return(Fr8ReflectionHelper.PropertiesVisitorOp.Terminate); } var keyValuePair = tempValue as KeyValueDTO; if (keyValuePair != null) { if (keyValuePair.Key == fieldKey) { value = keyValuePair.Value; return(Fr8ReflectionHelper.PropertiesVisitorOp.Terminate); } return(Fr8ReflectionHelper.PropertiesVisitorOp.SkipBranch); } return(Fr8ReflectionHelper.PropertiesVisitorOp.Continue); }); return(value); } // do nothing for uknown manifests return(null); }
private static FieldDTO FindField(OperationalStateCM operationalState, Crate crate, string fieldKey) { object searchArea; //let's check if we are in a loop //and this is a loop data? //check if this crate is loop related var loopState = operationalState.CallStack.FirstOrDefault(x => { if (x.LocalData?.Type == "Loop") { var loopStatus = x.LocalData.ReadAs <OperationalStateCM.LoopStatus>(); if (loopStatus != null && loopStatus.CrateManifest.CrateDescriptions[0].Label == crate.Label && loopStatus.CrateManifest.CrateDescriptions[0].ManifestType == crate.ManifestType.Type) { return(true); } } return(false); }); if (loopState != null) //this is a loop related data request { searchArea = GetDataListItem(crate, loopState.LocalData.ReadAs <OperationalStateCM.LoopStatus>().Index); } else { //hmmm this is a regular data request //lets search in complete crate searchArea = crate; //if we have a StandardTableDataCM and we are not in the loop and crate has Headers - we should search next row if (crate.IsOfType <StandardTableDataCM>()) { var tableCrate = crate.Get <StandardTableDataCM>(); if (tableCrate.FirstRowHeaders && tableCrate.Table.Count > 1) { //TODO it is weird to get just first row of table data while searching for a field //note: GetDataListItem function skips header TableRowDTO row = GetDataListItem(crate, 0) as TableRowDTO; if (row != null) { return(row.Row.FirstOrDefault(a => a.Cell.Key == fieldKey)?.Cell); } } } } if (searchArea is Crate) { if (((Crate)searchArea).IsKnownManifest) { searchArea = ((Crate)searchArea).Get(); } else { return(null); } } //we should find first related field and return var fields = Fr8ReflectionHelper.FindFieldsRecursive(searchArea); var fieldMatch = fields.FirstOrDefault(f => f.Key == fieldKey); //let's return first match return(fieldMatch); }