public IEnumerable <InitializerObject> Resolve(XDocument document)
        {
            foreach (XAttribute attribute in document.Root.Attributes())
            {
                if (attribute.IsNamespaceDeclaration &&
                    NamespaceDeclaration.Resolve(attribute.Name.NamespaceName, attribute.Value, out NamespaceDeclaration declaration))
                {
                    if (!_assemblyKeys.ContainsKey(declaration.Token))
                    {
                        _assemblyKeys.Add(declaration.Token, declaration);
                    }
                }
            }
            List <InitializerObject> objects = new List <InitializerObject>();

            foreach (XElement element in document.Root.Elements())
            {
                try
                {
                    InitializerObject instance = Resolve(element);
                    if (instance != null)
                    {
                        objects.Add(instance);
                    }
                    //TODO: error log
                }
                catch (Exception)
                {
                    //TODO: error log
                }
            }
            return(objects);
        }
 private void CallDictionaryAdd(XElement parent, InitializerObject instance, object reflobj, Func <object, object[], object> method)
 {
     if (GetKey(parent, out string key))
     {
         method.Invoke(reflobj, new[] { key, GetObject(parent, instance) });
     }
 }
Example #3
0
 internal InitializerMethod(string name, Type returntype, InitializerObject parent, MethodMetadata meta)
 {
     Name       = name;
     ReturnType = returntype;
     _meta      = meta;
     _parent    = parent;
 }
Example #4
0
 internal InitializerProperty(string name, Type type, InitializerObject obj, PropertyMetadata meta)
 {
     Name   = name;
     Type   = type;
     _obj   = obj;
     _meta  = meta;
     _value = meta.DefaultValue;
 }
Example #5
0
 public PropertyBinding(InitializerObject source, string propertyname)
 {
     //Type sourcetype = source.GetType();
     if (!source.GetType().IsClass)
     {
         throw new NotSupportedException();
     }
     if (source is INotifyPropertyChanged)
     {
         ((INotifyPropertyChanged)source).PropertyChanged += HandleChangedEvent;
     }
     _source       = source;
     _propertyname = propertyname;
 }
        private void ResolveAttributes(InitializerObject instance, XAttribute attribute)
        {
            string propertyname = attribute.Name.LocalName;

            if (attribute.IsNamespaceDeclaration && !_assemblyKeys.ContainsKey(propertyname))
            {
                if (NamespaceDeclaration.Resolve(propertyname, attribute.Value, out NamespaceDeclaration declaration))
                {
                    _assemblyKeys.Add(propertyname, declaration);
                }
            }
            else
            {
                int count = NestedArgument.ResolveNestedParenthesses(attribute.Value, '{', '}', out IEnumerable <NestedArgument> nestedargument);
                if (!instance.GetProperty(propertyname, out InitializerProperty property))
                {
                    _debug?.Pass(this, "initializer/instance/noproperty", (s) => string.Format(s, propertyname, instance, instance.GetType()));
                }
                else if (count > 1)
                {
                    _debug?.Pass(this, "initializer/format/chained", (s) => string.Format(s, attribute.Value));
                }
                else if (count == 1)
                {
                    NestedArgument argument = nestedargument.First();
                    if (ResolveExtension(argument, property.Type, out object obj))
                    {
                        if (obj is PropertyBinding binding)
                        {
                            property.Register(binding);
                        }
                        else if (obj != null)
                        {
                            property.SetValue(obj);
                        }
                    }
                    else
                    {
                        _debug?.Pass(this, "initializer/extension/failed", (s) => string.Format(argument.Scope));
                    }
                }
                else if (count == 0 && SaveChangeType(property.Type, attribute.Value, out object obj))
                {
                    property.SetValue(obj);
                }
            }
        }
        private void ResolveElements(InitializerObject instance, XElement parent, XElement node, ContentPropertyAttribute contentproperty)
        {
            string propertysource;

            string[] nodename = node.Name.LocalName.Split(new[] { '.' }, StringSplitOptions.RemoveEmptyEntries);
            if (nodename.Length > 2)
            {
                //TODO: loggen
                return;
            }
            else if (nodename.Length == 2 && string.Equals(nodename[0], parent.Name.LocalName))
            {
                propertysource = nodename[1];
            }
            else if (contentproperty == null)
            {
                _debug?.Pass(this, "initializer/element/nocontent", (s) => string.Format(s, parent.Name));
                propertysource = null;
            }
            else
            {
                propertysource = contentproperty.Name;
            }
            if (!string.IsNullOrWhiteSpace(propertysource))
            {
                if (instance.GetProperty(propertysource, out InitializerProperty property))
                {
                    object propertyvalue = property.GetValue();
                    if (propertyvalue is IAddContent propertyinterface)
                    {
                        if (nodename.Length == 2)
                        {
                            foreach (XElement ele in node.Elements())
                            {
                                propertyinterface.Add(GetObject(ele, propertyinterface));
                            }
                        }
                        else
                        {
                            propertyinterface.Add(GetObject(node, instance));
                        }
                    }
                    else if (propertyvalue is ResourceContent)
                    {
                        InitializerObject proptertyobject = propertyvalue as InitializerObject;
                        if (contentproperty != null && propertysource == contentproperty.Name)
                        {
                            CallDictionaryAdd(node, instance, null, (n, v) => proptertyobject.Invoke(contentproperty.MethodName, out object res, v));
                        }
                        else
                        {
                            foreach (XElement ele in node.Elements())
                            {
                                CallDictionaryAdd(ele, instance, null, (n, v) =>
                                                  proptertyobject.Invoke(contentproperty.MethodName, out object res, v));
                            }
                        }
                    }
                    else if (propertyvalue is InitializerObject propertyobject)
                    {
                        if (nodename.Length == 2)
                        {
                            if (propertyobject.HasMethod(contentproperty.MethodName))
                            {
                                if (contentproperty != null && propertysource == contentproperty.Name)
                                {
                                    propertyobject.Invoke(contentproperty.MethodName, out object res, GetObject(node, instance));
                                }
                                else
                                {
                                    foreach (XElement ele in node.Elements())
                                    {
                                        propertyobject.Invoke(contentproperty.MethodName, out object res, GetObject(ele, instance));
                                    }
                                }
                            }
                            else
                            {
                                _debug?.Pass(this, "initializer/contentmethod/notfound", (s) => string.Format(s, propertyvalue, instance));
                            }
                        }
                        else if (!propertyobject.Invoke("Add", out object res, GetObject(node, instance)))
                        {
                            _debug?.Pass(this, "initializer/contentmethod/notfound", (s) => string.Format(s, propertyvalue, instance));
                        }
                    }
                    else if (property.Type.GetInterfaces().Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IDictionary <,>) || i == typeof(IDictionary)))
                    {
                        MethodInfo method = property.Type.GetMethods().FirstOrDefault(m => m.Name.ToLower() == "add" && m.GetParameters().Count() == 2);
                        if (method == null)
                        {
                            _debug?.Pass(this, "initializer/contentmethod/notfound", (s) => string.Format(s, propertyvalue, instance));
                        }
                        else if (contentproperty != null && propertysource == contentproperty.Name)
                        {
                            CallDictionaryAdd(node, instance, propertyvalue, method.Invoke);
                        }
                        else
                        {
                            foreach (XElement ele in node.Elements())
                            {
                                CallDictionaryAdd(ele, instance, propertyvalue, method.Invoke);
                            }
                        }
                    }
                    else if (property.Type.GetInterfaces().Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(ICollection <>) || i == typeof(ICollection)))
                    {
                        MethodInfo method = property.Type.GetMethods().FirstOrDefault(m => m.Name.ToLower() == "add" && m.GetParameters().Count() == 1);
                        if (method == null)
                        {
                            _debug?.Pass(this, "initializer/contentmethod/notfound", (s) => string.Format(s, propertyvalue, instance));
                        }
                        else if (contentproperty != null && propertysource == contentproperty.Name)
                        {
                            method.Invoke(propertyvalue, new[] { GetObject(node, instance) });
                        }
                        else
                        {
                            foreach (XElement ele in node.Elements())
                            {
                                method.Invoke(propertyvalue, new[] { GetObject(ele, instance) });
                            }
                        }
                    }
                    else
                    {
                        //InitializerProperty initializerproperty;
                        if (node.HasElements)
                        {
                            instance.SetValue(propertysource, GetObject(node.Elements().FirstOrDefault(), instance));
                        }
                        else if (instance.GetProperty(nodename[1], out InitializerProperty initializerproperty))
                        {
                            if (SaveChangeType(initializerproperty.Type, (node.FirstNode as XText).Value.TrimStart('\n', '\r', ' ').TrimEnd('\n', '\r', ' '), out object value))
                            {
                                initializerproperty.SetValue(value);
                            }
                        }
                    }
                }
                else
                {
                    _debug?.Pass(this, "initializer/contentproperty/unexpected", s => string.Format(s, instance));
                }
            }
        }