/// <summary> /// Create type descriptor from given type. /// </summary> /// <param name="type">Type from which descriptor will be created.</param> /// <param name="resolver">The generic parameter resolver.</param> /// <returns>Created type descriptor.</returns> public static TypeDescriptor Create(Type type, ParameterResolver resolver = null) { var builder = new TypeDescriptorBuilder(); if (resolver == null) { //create default routine for parameters resolver var parameters = new Dictionary <Type, int>(); resolver = (t) => { int number; if (!parameters.TryGetValue(t, out number)) { number = parameters.Count; parameters.Add(t, number); } return(TypeDescriptor.GetParameter(number)); }; } var adapter = new TypeAdapter(type); var result = TypeHierarchyDirector.BuildDescriptor(adapter, (a) => resolver((a as TypeAdapterBase <Type>).AdaptedType)); return(result); }
/// <summary> /// Build TypeDescriptor from given TypeReference. Available substitutions are used. /// </summary> /// <param name="type">TypeReference which descriptor is builded</param> /// <returns>Built TypeDescriptor if available, <c>null</c> otherwise</returns> internal TypeDescriptor BuildDescriptor(TypeReference type) { if (type == null) { return(null); } var adapted = new TypeReferenceAdapter(type); return(TypeHierarchyDirector.BuildDescriptor(adapted, resolveSubstitution)); }