Во-первых, я бы, вероятно, добавил статическую функцию к Средам, чтобы определить, является ли строка "средой".
private static string[] allEnvirons;
public static bool IsEnvironment(string value)
{
return allEnvirons.Contains(data, StringComparer.OrdinalIgnoreCase);
}
Тогда единственный вопрос - как заполнить переменную allEnvirons. Если класс Envrionments не сильно изменится, вы можете просто напечатать список констант вручную (да, он повторяет константы, но только один раз и близко, поэтому вы должны помнить об изменении обоих, если необходимо внести изменения). В качестве альтернативы, если среды часто меняются, вы можете использовать отражение для заполнения массива. Скажи:
allEnvirons = (from f in typeof(Environments)
.GetFields(Reflection.BindingFlags.Public |
Reflection.BindingFlags.Static
select (string)(f.GetValue(null))).ToArray()
В любом случае ваш запрос становится примерно таким:
this.environments = (from e in settings.Element("Settings")
.Element("Environments")
.Elements("Environment")
where e.HasAttribute("name") &&
Environments.IsEnvironment(e.Attribute("name"))
).ToDictionary(...);