假设我有一个包含本地环境的结构:
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(...)
我该怎么做呢?我是否需要反射来获取结构中常量的值?
答案 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;