Похоже, что это неприятный API, для которого нельзя избежать исключения (насколько я знаю).
Попробуйте что-то вроде этого:
IEnumerable<Type> interfaces;
try
{
interfaces = _assembly.GetTypes().Where(x => x.IsInterface);
}
catch (ReflectionTypeLoadException ex)
{
interfaces = ex.Types.Where(x => x != null && x.IsInterface);
}
UPDATE
На самом деле, это так безобразно , что я, вероятно, где-то спрятал бы это. Это, должно быть, очень старая часть .NET Framework, потому что я уверен, что в наши дни они не будут так ее проектировать.
private static IEnumerable<Type> GetTypesSafely(Assembly assembly)
{
try
{
return assembly.GetTypes();
}
catch(ReflectionTypeLoadException ex)
{
return ex.Types.Where(x => x != null);
}
}
...
IEnumberable<Type> interfaces = GetTypesSafely(_assembly).Where(x => x.IsInterface);
Если вы думаете, что будете делать это очень часто, то метод расширения может быть более подходящим.