/// <summary> /// Build a segment to predicate mapper /// </summary> /// <param name="propertyInfo"></param> /// <returns></returns> public virtual IRelativeRouteToPredicateMapper BuildMapper(PropertyInfo propertyInfo) { if (propertyInfo.PropertyType == typeof(DateTime)) { return(new RouteDateSegmentAttribute.DateUrlSegmentMapper(DateSegmentFormat.YearMonthDay)); } if (propertyInfo.GetCustomAttributes <ForeignKeyAttribute>().Any()) { var foreignKeyInfo = DataReferenceFacade.GetForeignKeyProperties(propertyInfo.DeclaringType) .FirstOrDefault(p => p.SourcePropertyName == propertyInfo.Name); if (foreignKeyInfo != null) { var targetType = foreignKeyInfo.TargetType; var dataTypeMapper = AttributeBasedRoutingHelper.GetPredicateMapper(targetType); if (dataTypeMapper != null) { var typeConst = typeof(DataReferenceRelativeRouteToPredicateMapper <,>) .MakeGenericType(targetType, foreignKeyInfo.SourcePropertyInfo.PropertyType) .GetConstructors().Single(); return((IRelativeRouteToPredicateMapper)typeConst.Invoke(new object[] { dataTypeMapper })); } } } var type = typeof(DefaultRelativeRouteToPredicateMapper <>).MakeGenericType(propertyInfo.PropertyType); var constructor = type.GetConstructor(new Type[0]); return(constructor.Invoke(null) as IRelativeRouteToPredicateMapper); }
public static AttributeBasedRoutedDataUrlMapper GetDataUrlMapper(Type dataType, Guid pageId) { var mapper = AttributeBasedRoutingHelper.GetPredicateMapper(dataType); if (mapper == null) { return null; } return new AttributeBasedRoutedDataUrlMapper(dataType, pageId, mapper); }