Я думаю, что это хороший пример динамического фабричного шаблона . Я делаю это все время. Я понимаю ваше беспокойство по поводу обработки исключений, но я думаю, что в этом нет необходимости, просто потому, что ваши модульные тесты не позволят этой фабрике когда-либо генерировать во время производства, и хороший модульный тест может объяснить проблему так же ясно, как сообщение об исключении.
Но если вы действительно хотите выполнить проверку на ошибки, ваш запрос LINQ никогда не выдаст исключение. Это ToDictionary
, который бросает, когда есть двойной ключ. Что вы можете сделать, это проверить результаты запроса LINQ и передать двойные ключи:
static GraphFactory()
{
var items = (
from type in _assembly.GetTypes()
where type.GetInterface(typeof(IGraph).FullName) != null
from attribute in type.GetCustomAttributes(true)
.OfType<GraphTypeAttribute>
select new { attribute, type }).ToArray();
ValidateTypes(items);
_item = items.ToDictionary(
k => k.attribute.CustomType, e => e.type);
}
private static void ValidateTypes<T>(T[] items)
{
var firstDoubleCustomType = (
from item in items
group item by item.attribute.CustomType into g
where g.Count() > 1
select g.Key).FirstOrDefault();
if (firstDoubleCustomType != null)
{
throw new InvalidProgramException(
"Doube: " + firstDoubleCustomType.ToString());
}
}