diff --git a/src/SenseNet.Tools.Tests/SenseNet.Tools.Tests.csproj b/src/SenseNet.Tools.Tests/SenseNet.Tools.Tests.csproj index c16e14c..e680eff 100644 --- a/src/SenseNet.Tools.Tests/SenseNet.Tools.Tests.csproj +++ b/src/SenseNet.Tools.Tests/SenseNet.Tools.Tests.csproj @@ -65,6 +65,7 @@ + diff --git a/src/SenseNet.Tools.Tests/TypeResolverTests.cs b/src/SenseNet.Tools.Tests/TypeResolverTests.cs new file mode 100644 index 0000000..0732444 --- /dev/null +++ b/src/SenseNet.Tools.Tests/TypeResolverTests.cs @@ -0,0 +1,65 @@ +using System.Linq; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace SenseNet.Tools.Tests +{ + #region Test classes + + internal interface ITestInterface + { + } + + internal class BaseClass + { + } + + internal class DerivedClass1 : BaseClass + { + } + internal class DerivedClass11 : DerivedClass1, ITestInterface + { + } + internal class IndependentClass1 : ITestInterface + { + } + + #endregion + + [TestClass] + public class TypeResolverTests + { + [TestMethod] + public void TypeResolver_GetType() + { + var t = TypeResolver.GetType("SenseNet.Tools.TypeResolver"); + Assert.IsNotNull(t); + } + + [TestMethod] + public void TypeResolver_GetTypesByBaseType() + { + var types = TypeResolver.GetTypesByBaseType(typeof(BaseClass)); + + Assert.AreEqual(2, types.Length); + Assert.IsTrue(types.Any(t => t.Name == "DerivedClass1")); + Assert.IsTrue(types.Any(t => t.Name == "DerivedClass11")); + } + [TestMethod] + public void TypeResolver_GetTypesByInterface() + { + var types = TypeResolver.GetTypesByInterface(typeof(ITestInterface)); + + Assert.AreEqual(2, types.Length); + Assert.IsTrue(types.Any(t => t.Name == "DerivedClass11")); + Assert.IsTrue(types.Any(t => t.Name == "IndependentClass1")); + } + + [TestMethod] + [ExpectedException(typeof(TypeNotFoundException))] + public void TypeResolver_Error_GetType() + { + var t = TypeResolver.GetType("UnknownType"); + Assert.IsNotNull(t); + } + } +} diff --git a/src/SenseNet.Tools/Tools/TypeResolver.cs b/src/SenseNet.Tools/Tools/TypeResolver.cs index d91d9cf..a0f74d5 100644 --- a/src/SenseNet.Tools/Tools/TypeResolver.cs +++ b/src/SenseNet.Tools/Tools/TypeResolver.cs @@ -247,10 +247,18 @@ public static Type[] GetTypesByInterface(Type interfaceType) list.AddRange(asm.GetTypes().Where(type => type.GetInterfaces().Any(interf => interf == interfaceType))); } - catch (Exception e) + catch (ReflectionTypeLoadException e) { if (!IgnorableException(e)) + { + LogTypeLoadException(e, asm.FullName); throw; + } + } + catch (Exception e) + { + if (!IgnorableException(e)) + throw TypeDiscoveryError(e, null, asm); } } temp = list.ToArray(); @@ -300,17 +308,13 @@ public static Type[] GetTypesByBaseType(Type baseType) } } } - catch (ReflectionTypeLoadException rtle) + catch (ReflectionTypeLoadException e) { - SnLog.WriteError(rtle.ToString(), properties: new Dictionary { { "Assembly", asm.FullName } }); - - // Logging each exception - foreach (var exc in rtle.LoaderExceptions) + if (!IgnorableException(e)) { - SnLog.WriteError(exc); + LogTypeLoadException(e, asm.FullName); + throw; } - - throw; } catch (Exception e) { @@ -331,6 +335,15 @@ public static Type[] GetTypesByBaseType(Type baseType) return result; } + private static void LogTypeLoadException(ReflectionTypeLoadException rtle, string assemblyName = null) + { + SnLog.WriteError(rtle.ToString(), properties: new Dictionary { { "Assembly", assemblyName ?? "unknown" } }); + + foreach (var exc in rtle.LoaderExceptions) + { + SnLog.WriteError(exc); + } + } private static bool IgnorableException(Exception e) { if (!Debugger.IsAttached)