+| | | 1 | | using JetBrains.Annotations; |
+| | | 2 | | using System.Collections.Generic; |
+| | | 3 | | using System.Reflection; |
+| | | 4 | | using System.Linq.Dynamic.Core.Validation; |
+| | | 5 | | |
+| | | 6 | | namespace System.Linq.Dynamic.Core.CustomTypeProviders |
+| | | 7 | | { |
+| | | 8 | | /// <summary> |
+| | | 9 | | /// The abstract DynamicLinqCustomTypeProvider which is used by the <see cref="IDynamicLinkCustomTypeProvider"/> and |
+| | | 10 | | /// </summary> |
+| | | 11 | | public abstract class AbstractDynamicLinqCustomTypeProvider |
+| | | 12 | | { |
+| | | 13 | | /// <summary> |
+| | | 14 | | /// Finds the types marked with DynamicLinqTypeAttribute. |
+| | | 15 | | /// </summary> |
+| | | 16 | | /// <param name="assemblies">The assemblies to process.</param> |
+| | | 17 | | /// <returns>IEnumerable{Type}</returns> |
+| | | 18 | | protected IEnumerable<Type> FindTypesMarkedWithDynamicLinqTypeAttribute([NotNull] IEnumerable<Assembly> assembli |
+| | 26 | 19 | | { |
+| | 26 | 20 | | Check.NotNull(assemblies, nameof(assemblies)); |
+| | | 21 | | #if !NET35 |
+| | 5452 | 22 | | assemblies = assemblies.Where(x => !x.IsDynamic); |
+| | | 23 | | #endif |
+| | 26 | 24 | | var definedTypes = GetAssemblyTypes(assemblies); |
+| | | 25 | | |
+| | | 26 | | #if (WINDOWS_APP || DOTNET5_1 || UAP10_0 || NETSTANDARD) |
+| | 649691 | 27 | | return definedTypes.Where(x => x.CustomAttributes.Any(y => y.AttributeType == typeof(DynamicLinqTypeAttribut |
+| | | 28 | | #else |
+| | | 29 | | return definedTypes.Where(x => x.GetCustomAttributes(typeof(DynamicLinqTypeAttribute), false).Any()); |
+| | | 30 | | #endif |
+| | 26 | 31 | | } |
+| | | 32 | | |
+| | | 33 | | /// <summary> |
+| | | 34 | | /// Resolve any type which is registered in the current application domain. |
+| | | 35 | | /// </summary> |
+| | | 36 | | /// <param name="assemblies">The assemblies to inspect.</param> |
+| | | 37 | | /// <param name="typeName">The typename to resolve.</param> |
+| | | 38 | | /// <returns>A resolved <see cref="Type"/> or null when not found.</returns> |
+| | | 39 | | protected Type ResolveType([NotNull] IEnumerable<Assembly> assemblies, [NotNull] string typeName) |
+| | 2 | 40 | | { |
+| | 2 | 41 | | Check.NotNull(assemblies, nameof(assemblies)); |
+| | 2 | 42 | | Check.NotEmpty(typeName, nameof(typeName)); |
+| | | 43 | | |
+| | 276 | 44 | | foreach (Assembly assembly in assemblies) |
+| | 136 | 45 | | { |
+| | 136 | 46 | | Type resolvedType = assembly.GetType(typeName, false, true); |
+| | 136 | 47 | | if (resolvedType != null) |
+| | 2 | 48 | | { |
+| | 2 | 49 | | return resolvedType; |
+| | | 50 | | } |
+| | 134 | 51 | | } |
+| | | 52 | | |
+| | 0 | 53 | | return null; |
+| | 2 | 54 | | } |
+| | | 55 | | |
+| | | 56 | | #if (WINDOWS_APP || DOTNET5_1 || UAP10_0 || NETSTANDARD) |
+| | | 57 | | /// <summary> |
+| | | 58 | | /// Gets the assembly types in an Exception friendly way. |
+| | | 59 | | /// </summary> |
+| | | 60 | | /// <param name="assemblies">The assemblies to process.</param> |
+| | | 61 | | /// <returns>IEnumerable{Type}</returns> |
+| | | 62 | | protected IEnumerable<TypeInfo> GetAssemblyTypes([NotNull] IEnumerable<Assembly> assemblies) |
+| | 26 | 63 | | { |
+| | 26 | 64 | | Check.NotNull(assemblies, nameof(assemblies)); |
+| | | 65 | | |
+| | 10839 | 66 | | foreach (var assembly in assemblies) |
+| | 5380 | 67 | | { |
+| | 5380 | 68 | | IEnumerable<TypeInfo> definedTypes = null; |
+| | | 69 | | |
+| | | 70 | | try |
+| | 5385 | 71 | | { |
+| | 5383 | 72 | | definedTypes = assembly.DefinedTypes; |
+| | 5373 | 73 | | } |
+| | 0 | 74 | | catch |
+| | 0 | 75 | | { |
+| | | 76 | | // Ignore error |
+| | 0 | 77 | | } |
+| | | 78 | | |
+| | 5377 | 79 | | if (definedTypes != null) |
+| | 5375 | 80 | | { |
+| | 925629 | 81 | | foreach (var definedType in definedTypes) |
+| | 454817 | 82 | | { |
+| | 455017 | 83 | | yield return definedType; |
+| | 454946 | 84 | | } |
+| | 5383 | 85 | | } |
+| | 5381 | 86 | | } |
+| | 26 | 87 | | } |
+| | | 88 | | #else |
+| | | 89 | | /// <summary> |
+| | | 90 | | /// Gets the assembly types in an Exception friendly way. |
+| | | 91 | | /// </summary> |
+| | | 92 | | /// <param name="assemblies">The assemblies to process.</param> |
+| | | 93 | | /// <returns>IEnumerable{Type}</returns> |
+| | | 94 | | protected IEnumerable<Type> GetAssemblyTypes([NotNull] IEnumerable<Assembly> assemblies) |
+| | | 95 | | { |
+| | | 96 | | Check.NotNull(assemblies, nameof(assemblies)); |
+| | | 97 | | |
+| | | 98 | | foreach (var assembly in assemblies) |
+| | | 99 | | { |
+| | | 100 | | IEnumerable<Type> definedTypes = null; |
+| | | 101 | | |
+| | | 102 | | try |
+| | | 103 | | { |
+| | | 104 | | definedTypes = assembly.GetTypes(); |
+| | | 105 | | } |
+| | | 106 | | catch |
+| | | 107 | | { |
+| | | 108 | | // Ignore error |
+| | | 109 | | } |
+| | | 110 | | |
+| | | 111 | | if (definedTypes != null) |
+| | | 112 | | { |
+| | | 113 | | foreach (var definedType in definedTypes) |
+| | | 114 | | { |
+| | | 115 | | yield return definedType; |
+| | | 116 | | } |
+| | | 117 | | } |
+| | | 118 | | } |
+| | | 119 | | } |
+| | | 120 | | #endif |
+| | | 121 | | } |
+| | | 122 | | } |
+
+