private ExtendedProperty InitializeProperty(PropertyInfo extendedProp) { var serverProp = ServerType.GetPropertySearchInheritedInterfaces(extendedProp.Name); var extPropType = extendedProp.PropertyType; if (serverProp != null) { var serverPropType = serverProp.PropertyType; ExtendedResourceInfo propExtInfo; if (this.mapper.TryGetExtendedResourceInfo(extPropType, out propExtInfo) && typeof(IClientResource).IsAssignableFrom(serverPropType)) { return(new ExtendedComplexOverlayProperty(extendedProp, serverProp, propExtInfo)); } Type extPropElementType; Type serverPropElementType; if (extPropType.TryGetEnumerableElementType(out extPropElementType) && this.mapper.TryGetExtendedResourceInfo(extPropElementType, out propExtInfo) && serverPropType.TryGetEnumerableElementType(out serverPropElementType) && serverPropElementType == propExtInfo.ServerType) { return(new ExtendedCollectionOverlayProperty(extendedProp, serverProp, propExtInfo)); } } else if (DictProperty != null) { if (!extPropType.IsValueType || extPropType.IsNullable()) { return(ExtendedAttributeProperty.Create(extendedProp, this)); } else { var message = $"Unable to map property {extendedProp.Name} of type {ExtendedType.FullName} to underlying dictionary property {DictProperty.Name} of {ServerType.FullName}. Only nullable value types can be mapped to a dictionary."; return(new InvalidExtendedProperty(extendedProp, message)); } } return(new InvalidExtendedProperty(extendedProp, $"Unable to map property {extendedProp.Name} of type {ExtendedType.FullName} to any underlying dictionary property having a [ResourceAttributesProperty] on {ServerType.FullName}.")); }