2010-04-13 15 views
1

比方說,我有一個包含本地環境的一個結構:如何將一組XElement加入到結構的值中?

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

我該如何去做這件事?我是否需要反射來獲取結構中常量的值?

回答

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

謝謝,這是被絆倒了我的的GetValue(空)。在看完它後有意義,但這是違反直覺的。 – jcollum 2010-04-20 16:22:37

0

爲什麼你需要使用結構來定義不同enviroments VS枚舉任何具體的原因是什麼?

如果你可以用枚舉,你可以做這樣的事情

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; 
+0

如果我使用結構,環境的名稱和它們的鍵值是分離的。然後,我可以在字典中使用這些鍵值(例如「PROD_SA」),但仍然具有將ProdSa環境定義爲Environments.ProdSa的語法糖。我試圖保持我的評論簡短,所以我希望它是有道理的。 – jcollum 2010-04-15 14:44:50

+0

是的,評論是有道理的,但我仍然覺得像一個枚舉是一個合理的選擇。請記住,您可以使用Description屬性修飾Enum值,以向Enum添加Text值並將該值用作集合中的鍵。 像這樣簡單:http://www.codeproject.com/KB/cs/enumwithdescription.aspx – 2010-04-16 01:54:42

+0

真;他們都工作,他們都需要反思,讓他們按我想要的方式工作。 – jcollum 2010-04-19 20:30:46

相關問題