コード例 #1
0
        public static XmlAttributeOverrides GenerateLayoutOverrides <T>()
        {
            Type tType = typeof(T);

            TypeInfo tTypeInfo = tType.GetTypeInfo();

            IEnumerable <PropertyInfo> props = tType.GetRuntimeProperties();

            XmlAttributeOverrides overrides = new XmlAttributeOverrides();

            foreach (PropertyInfo prop in props)
            {
                XmlDerrivedAttribute attr = prop.GetCustomAttribute <XmlDerrivedAttribute>();

                if (attr == null)
                {
                    continue;
                }

                Type dType = prop.DeclaringType;

                Type     pType     = prop.PropertyType;
                TypeInfo pTypeInfo = pType.GetTypeInfo();

                Type enumType = typeof(IEnumerable <>);

                if (pTypeInfo.IsGenericType &&
                    pTypeInfo.ImplementedInterfaces.Any(t =>
                                                        (t.GetTypeInfo().IsGenericType&& t.GetGenericTypeDefinition() == enumType)))
                {
                    pType = pType.GenericTypeArguments[0];
                }

                XmlAttributes overrideAttributes = GenerateOverrideAttributes(dType, pType, attr);

                overrides.Add(dType, prop.Name, overrideAttributes);
            }

            return(overrides);
        }
コード例 #2
0
        private static XmlAttributes GenerateOverrideAttributes(Type declaringType, Type propertyType, XmlDerrivedAttribute attr)
        {
            XmlAttributes xAttrs = new XmlAttributes();

            Assembly           a             = declaringType.GetTypeInfo().Assembly;
            TypeInfo           interfaceType = propertyType.GetTypeInfo();
            IEnumerable <Type> types         = a.ExportedTypes.Where(t => interfaceType.IsAssignableFrom(t.GetTypeInfo()) && !t.GetTypeInfo().IsAbstract);

            foreach (Type t in types)
            {
                string name = NameBySourceType(t, attr.SrcType);                // t.GetTypeInfo().GetCustomAttribute<XmlTypeAttribute>().TypeName;
                XmlElementAttribute xAttr = new XmlElementAttribute();
                xAttr.ElementName = name;
                xAttr.Type        = t;
                xAttrs.XmlElements.Add(xAttr);
            }

            return(xAttrs);
        }