如何将一组XElements连接到结构的值?

时间:2010-04-13 22:31:48

标签: c# linq reflection struct

假设我有一个包含本地环境的结构:

 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"; 
    }

我想从xml doc中提取一组XElements,但只有那些具有与struct中的值匹配的键的元素。

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 个答案:

答案 0 :(得分:1)

首先,我可能会向环境添加一个静态函数来确定字符串“是否是一个环境”。

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(...);

答案 1 :(得分:0)

您需要使用结构来定义不同环境与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;