public IDataType GetType(string typeName)
        {
            var assemblyNameFilter = new PassOnceNameFilter();

            var foundType = SearchReferencedAssemblies(typeName, seedAssembly, assemblyNameFilter);

            if (foundType != null)
            {
                typesCache.Add(typeName, foundType);
            }

            return dataTypeFactory.Create(foundType);
        }
        private static Type SearchReferencedAssemblies(string typeName, Assembly assembly,
            PassOnceNameFilter assemblyNameFilter)
        {
            Type foundType = null;

            var assemblies = assembly.GetReferencedAssemblies();

            foreach (var assemblyName in assemblies)
            {
                if (assemblyNameFilter.Pass(assemblyName.Name))
                {
                    Assembly referencedAssembly;
                    try
                    {
                        referencedAssembly = Assembly.Load(assemblyName);
                    }
                    catch (Exception exception)
                    {
                        throw new NSerializerException(
                            string.Format(
                                "Error while tring to find type '{0}'.\nUnable to load assembly '{1}' which is refrenced by assembly '{2}'.",
                                typeName, assemblyName.Name, assembly.FullName),
                            exception);
                    }

                    foundType = referencedAssembly.GetType(typeName);
                    if (foundType == null)
                    {
                        foundType = SearchReferencedAssemblies(typeName, referencedAssembly, assemblyNameFilter);
                    }

                    if (foundType != null)
                    {
                        break;
                    }
                }
            }

            return foundType;
        }
 protected override void SetUp()
 {
     filter = new PassOnceNameFilter();
 }