private void SetValue(TypeValueNode typeValueNode) { object data; if (typeValueNode.Parent != null) { data = ((TypeValueNode)typeValueNode.Parent).Value; } else { data = _data; } if (data != null) { object value = typeValueNode.TypeValueAccess.GetValue(data); if (typeValueNode.TypeValueAccess.IsEnumerable) { typeValueNode.Enumerator = ((IEnumerable)value).GetEnumerator(); if (typeValueNode.Enumerator != null && typeValueNode.Enumerator.MoveNext()) { typeValueNode.Value = typeValueNode.Enumerator.Current; } } else { typeValueNode.Value = value; } } else { typeValueNode.Value = null; } typeValueNode.ValueAvailable = true; }
private void _GetValue(TypeValueNode typeValueNode) { if (!typeValueNode.ValueAvailable) { //object data = null; if (typeValueNode.Parent != null) { _GetValue((TypeValueNode)typeValueNode.Parent); //data = memberValue.Parent.Value; } //else // data = _data; //if (data != null) //{ // object value = memberValue.MemberAccess.GetValue(data); // if (memberValue.MemberAccess.IsEnumerable) // { // memberValue.Enumerator = ((IEnumerable)value).GetEnumerator(); // if (memberValue.Enumerator != null && memberValue.Enumerator.MoveNext()) // memberValue.Value = memberValue.Enumerator.Current; // } // else // memberValue.Value = value; //} //memberValue.ValueAvailable = true; SetValue(typeValueNode); } }
public object GetValue(TypeValueNode typeValueNode, bool onlyNextValue = false) { if (!_nextValue) { _GetValue(typeValueNode); } if (!_nextValue || !onlyNextValue || typeValueNode.FoundNext) { return(typeValueNode.Value); } else { return(null); } }
private void InitEnumerates() { if (_enumerates == null) { //List<MemberValue> enumerates = new List<MemberValue>(); _enumerates = new List <TypeValueNode>(); // loop on root values foreach (TypeValueNode typeValueNode in _typeValueNodes.Values) { if (typeValueNode.Parent == null) { TypeValueNode typeValueNode2 = typeValueNode; while (typeValueNode2 != null) { // loop on childs while (typeValueNode2.Child != null) { typeValueNode2 = (TypeValueNode)typeValueNode2.Child; } AddEnumerate(typeValueNode2); // take siblin or siblin of parent while (true) { if (typeValueNode2.Siblin != null) { typeValueNode2 = (TypeValueNode)typeValueNode2.Siblin; break; } else { // no more siblin, test if parent is enumerate typeValueNode2 = (TypeValueNode)typeValueNode2.Parent; if (typeValueNode2 == null) { break; } AddEnumerate(typeValueNode2); } } } } } //_enumerates = enumerates.ToArray(); } }
public void AddAllValues(MemberType memberType = MemberType.Instance | MemberType.Public | MemberType.Field | MemberType.Property) { foreach (TreeValue <TypeValueInfo> treeValueInfo in _type.zGetTypeAllValuesInfos(memberType, options: TypeReflectionOptions.ValueType | TypeReflectionOptions.NotValueType)) { TypeValueNode typeValueNode = new TypeValueNode { TypeValueAccess = new TypeValueAccess(treeValueInfo.Value, treeValueInfo.Value.TreeName) }; TypeValueNode parent = null; if (treeValueInfo.Value.ParentName != null) { parent = _typeValueNodes[treeValueInfo.Value.ParentName]; typeValueNode.SetParent(parent); } //if (typeValueNode.TypeValueAccess.IsValueType) // yield return typeValueNode; // $$$$$$$$$$$$ bug $$$$$$$$$$$$ il peut y avoir des doublons _typeValueNodes.Add(treeValueInfo.Value.TreeName, typeValueNode); } }
private void UpdateChildsValues(TypeValueNode typeValueNode) { // memberValue.ValueAvailable // memberValue.FoundNext = false; // memberValue.ChildFoundNext = false; //object data = memberValue.Value; TypeValueNode typeValueNode2 = typeValueNode; if (typeValueNode2.Child != null) { while (true) { // loop on childs while (typeValueNode2.Child != null) { typeValueNode2 = (TypeValueNode)typeValueNode2.Child; //memberValue2.ValueAvailable = false; SetValue(typeValueNode2); typeValueNode2.FoundNext = true; } while (true) { if (typeValueNode2.Siblin != null) { typeValueNode2 = (TypeValueNode)typeValueNode2.Siblin; //memberValue2.ValueAvailable = false; SetValue(typeValueNode2); typeValueNode2.FoundNext = true; } else { typeValueNode2 = (TypeValueNode)typeValueNode2.Parent; if (typeValueNode2 == typeValueNode) { return; } } } } } }
public TypeValueNode AddValue(string name, MemberType memberType = MemberType.Instance | MemberType.Public | MemberType.Field | MemberType.Property, bool notEnumerable = false) { string parentName = null; TypeValueNode parent = null; Type type = _type; TypeValueNode typeValueNode = null; foreach (string valueName in name.Split('.')) { string treeName = valueName; if (parentName != null) { treeName = parentName + "." + treeName; } typeValueNode = null; if (!_typeValueNodes.ContainsKey(treeName)) { TypeValueInfo typeValueInfo = type.zGetTypeValueInfo(valueName, memberType); if (typeValueInfo == null) { throw new PBException("unknow value \"{0}\" from type {1} memberType {2}", valueName, type.zGetTypeName(), memberType.ToString()); } typeValueNode = new TypeValueNode { TypeValueAccess = new TypeValueAccess(typeValueInfo, treeName) }; if (notEnumerable) { typeValueNode.TypeValueAccess.IsEnumerable = false; } typeValueNode.SetParent(parent); _typeValueNodes.Add(treeName, typeValueNode); } else { typeValueNode = _typeValueNodes[valueName]; } parentName = treeName; parent = typeValueNode; type = typeValueNode.TypeValueAccess.ValueType; } return(typeValueNode); }
private void AddEnumerate(TypeValueNode typeValueNode) { //Trace.WriteLine("test enumerate of {0}", memberValue.MemberAccess.TreeName); if (typeValueNode.TypeValueAccess.IsEnumerable) { _enumerates.Add(typeValueNode); // set ParentEnumerate TypeValueNode typeValueNode2 = typeValueNode; TypeValueNode typeValueNode3 = typeValueNode; while (typeValueNode3.Parent != null) { typeValueNode3 = (TypeValueNode)typeValueNode3.Parent; if (typeValueNode3.TypeValueAccess.IsEnumerable) { typeValueNode2.ParentEnumerate = typeValueNode3; typeValueNode2 = typeValueNode3; } } } }
public bool NextValues() { RazEnumerates(); bool found = false; foreach (TypeValueNode typeValueNode in _enumerates) { if (!typeValueNode.ChildFoundNext) { IEnumerator enumerator = typeValueNode.Enumerator; if (enumerator != null) { if (enumerator.MoveNext()) { found = true; typeValueNode.Value = enumerator.Current; typeValueNode.FoundNext = true; // update childs values UpdateChildsValues(typeValueNode); TypeValueNode typeValueNode2 = typeValueNode; while (true) { typeValueNode2 = typeValueNode2.ParentEnumerate; if (typeValueNode2 == null) { break; } typeValueNode2.ChildFoundNext = true; } } } } } _nextValue = true; return(found); }