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); }
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); }