예제 #1
0
 public static void WriteChartAttribute(this IChartAttribute attribute, XmlWriter writer)
 {
     WriteChartAttribute(attribute, AllProperty, writer);
 }
예제 #2
0
        public static void WriteChartAttribute(this IChartAttribute attribute, BindingFlags bindingFlags, XmlWriter writer)
        {
            if (attribute == null)
            {
                return;
            }

            var attributeType = attribute.GetType();

            var fields     = attributeType.Fields().ToList();
            var properties = attributeType.Properties(bindingFlags).ToList();
            var attributes = properties.Where(pi => pi.PropertyType.IsSameOrSubclassOf(ChartAttributeType)).ToArray();
            var elements   =
                properties.Where(
                    pi =>
                    pi.PropertyType.IsSameOrSubclassOf(ChartElementType) ||
                    (pi.PropertyType.IsSameOrSubclassOf(typeof(IEnumerable <>)) && pi.PropertyType != typeof(string))).ToArray();

            var valueProperties = properties.Except(attributes).Except(elements).ToList();

            var writtenPropertyNames = new List <string>();

            var prefix = string.Empty;

            // NOTE: Prefix가 있는 Attribute는 중복이 생길 수 있다!!!
            if (attributeType.Properties().Any(pi => pi.Name == "Prefix"))
            {
                prefix = attribute.GetPropertyValue("Prefix").AsText();

                if (IsDebugEnabled)
                {
                    log.Debug("[{0}]의 Prefix는 [{1}] 입니다.", attributeType.Name, prefix);
                }
            }

            foreach (var pi in valueProperties.Where(pi => pi.GetGetMethod(true) != null))
            {
                var name = pi.Name;

                if (name == "Prefix")
                {
                    continue;
                }
                if (name == "ElementName")
                {
                    continue;
                }

                if (IsDebugEnabled)
                {
                    log.Debug(@"속성정보를 XmlAttribute로 빌드하려고 합니다... PropertyName=" + name);
                }

                if (writtenPropertyNames.Contains(name) == false)
                {
                    var value = attribute.GetPropertyValue(name);

                    if (value != null)
                    {
                        if (IsDebugEnabled)
                        {
                            log.Debug(@"속성 값을 Xml Attribute로 빌드합니다., Property Name=[{0}], Value=[{1}]", prefix + name,
                                      value.ToFusionXmlString());
                        }

                        writer.WriteAttributeString(prefix + name, value.ToFusionXmlString());
                        writtenPropertyNames.Add(name);
                    }
                }
            }

            foreach (var pi in attributes)
            {
                var name = pi.Name;

                var fieldName        = FasterflectTool.GetMemberName(name, MemberNamingRule.CamelCaseUndercore);
                var fieldValueExists = fields.Any(fi => fi.Name == fieldName) && (attribute.TryGetFieldValue(fieldName) != null);

                if (fieldValueExists)
                {
                    var attr = attribute.TryGetPropertyValue(name);

                    if (attr != null && attr is IChartAttribute)
                    {
                        WriteChartAttribute((IChartAttribute)attr, bindingFlags, writer);
                    }
                }
            }
        }