Exemple #1
0
        /// <param name="allowSystemProperties">Allows path to end with a C# property that does not have a representation in the DSL model (ID property or the Guid property used for a Reference).</param>
        public static ValueOrError <PropertyInfo> GetPropertyByPath(DataStructureInfo source, string path, IDslModel existingConcepts, bool allowSystemProperties = true)
        {
            if (path.Contains(" "))
            {
                return(ValueOrError.CreateError("The path contains a space character."));
            }

            if (string.IsNullOrEmpty(path))
            {
                return(ValueOrError.CreateError("The path is empty."));
            }

            var propertyNames    = path.Split('.');
            var referenceNames   = propertyNames.Take(propertyNames.Count() - 1).ToArray();
            var lastPropertyName = propertyNames[propertyNames.Count() - 1];

            ValueOrError <DataStructureInfo> selectedDataStructure = source;

            foreach (var referenceName in referenceNames)
            {
                selectedDataStructure = NavigateToNextDataStructure(selectedDataStructure.Value, referenceName, existingConcepts);
                if (selectedDataStructure.IsError)
                {
                    return(ValueOrError.CreateError(selectedDataStructure.Error));
                }
            }

            PropertyInfo selectedProperty = FindProperty(existingConcepts, selectedDataStructure.Value, lastPropertyName);

            if (allowSystemProperties && selectedProperty == null && lastPropertyName == "ID")
            {
                return new GuidPropertyInfo {
                           DataStructure = selectedDataStructure.Value, Name = "ID"
                }
            }
            ;

            if (allowSystemProperties && selectedProperty == null && lastPropertyName.EndsWith("ID"))
            {
                string referenceName = lastPropertyName.Substring(0, lastPropertyName.Length - 2);

                var referencePrototype = new PropertyInfo {
                    DataStructure = selectedDataStructure.Value, Name = referenceName
                };
                if (existingConcepts.FindByKey(referencePrototype.GetKey()) != null)
                {
                    return new GuidPropertyInfo {
                               DataStructure = selectedDataStructure.Value, Name = lastPropertyName
                    }
                }
                ;
            }

            if (selectedProperty == null)
            {
                return(ValueOrError.CreateError("There is no property '" + lastPropertyName + "' on " + selectedDataStructure.Value.GetUserDescription() + "."));
            }

            return(selectedProperty);
        }