/// <summary> /// Gets the key from an object. /// If the key isn't unique and the property allows for key generation, a unique key is generated. /// </summary> /// <param name="target"></param> /// <param name="root"></param> /// <returns></returns> private static string GetKeyFromObject(IAggregate target, object root) { string key = null; int lastkey = 0; string[] property = target.Properties; int generatedProperty = -1; bool generationPossible = true; while (generationPossible) { key = null; lastkey++; generationPossible = false; for (int i = 0; i < property.Length; i++) { if ((Boolean) MetaInfo.GetAttributeDefault (target.Source.GetType(), property[i], "XmlKey", false)) { object KeyObject = target.GetValue(property[i]); if ((KeyObject != null) && (!KeyObject.ToString().Trim().Equals(""))) { key += KeyObject.ToString() + ";"; } else if ((Boolean) MetaInfo.GetAttributeDefault (target.Source.GetType(), property[i], "XmlAllowGeneration", true)) { generationPossible = true; generatedProperty = i; key += lastkey + ";"; } } } if (key != null) { key += target.Source.GetType().FullName; object registeredObject = XmlFile.GetRegisteredTarget(root, key); if ((registeredObject == null) || (registeredObject == target)) { if (generatedProperty != -1) { Type PropertyType = target.GetType(property[generatedProperty]); if (PropertyType.Equals(typeof(string))) { target.SetValue(property[generatedProperty], Convert.ToString(lastkey)); } else if (PropertyType.Equals(typeof(Int16)) || PropertyType.Equals(typeof(Int32)) || PropertyType.Equals(typeof(Int64))) { target.SetValue(property[generatedProperty], lastkey); } } return key; } } } return key; }