как соединить набор элементов XE со значениями структуры? - PullRequest
1 голос
/ 14 апреля 2010

Допустим, у меня есть структура, которая содержит локальные среды:

 public struct Environments
    {
        public const string Dev = "DEV";
        public const string Qa1 = "SQA";
        public const string Prod1 = "PROD";
        public const string Prod2 = "PROD_SA";
        public const string Uat = "UAT"; 
    }

И я хотел бы вытащить набор XElements из документа XML, но только те элементы, у которых есть ключ, который соответствует значению в структуре.

this.environments =(from e in 
settings.Element("Settings").Element("Environments")
       .Elements("Environment")
       .Where( x => x.HasAttribute("name") )
        join f in [struct?] on e.Attribute("name") 
        equals [struct value?]).ToDictionary(...)

Как бы я поступил так? Нужно ли рефлексия, чтобы получить значения констант в структуре?

Ответы [ 2 ]

1 голос
/ 14 апреля 2010

Во-первых, я бы, вероятно, добавил статическую функцию к Средам, чтобы определить, является ли строка "средой".

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(...);
0 голосов
/ 15 апреля 2010

Есть ли какая-либо конкретная причина, по которой вам нужно использовать структуру для определения различных сред и Enum?

Если вы можете использовать enum, вы можете сделать что-то вроде этого

public enum Enviroments
{   
    Dev,
    Qa1,
    Prod1,
    Prod2,
    Uat
}

    XDocument settings = XDocument.Load("Foo.xml");

    var matches = from e in settings.Descendants("Environment")
where Enum.IsDefined(typeof (Enviroments), e.Attribute("name"))
select e;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...