Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将一组元素连接到结构的值?_C#_Linq_Reflection_Struct - Fatal编程技术网

C# 如何将一组元素连接到结构的值?

C# 如何将一组元素连接到结构的值?,c#,linq,reflection,struct,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 strin

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

 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文档中提取一组元素,但只提取那些键与结构中的值匹配的元素

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

我该怎么做呢?我是否需要反射来获取结构中常量的值

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

那么唯一的问题就是如何填充allEnvirons变量。如果environments类变化不大,您可以手动键入常量列表(是的,它会重复这些常量,但只重复一次,因此如果需要进行更改,您应该记住同时更改这两个常量)。或者,如果环境经常变化,可以使用反射填充阵列。说:

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

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

那么唯一的问题就是如何填充allEnvirons变量。如果environments类变化不大,您可以手动键入常量列表(是的,它会重复这些常量,但只重复一次,因此如果需要进行更改,您应该记住同时更改这两个常量)。或者,如果环境经常变化,可以使用反射填充阵列。说:

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

为什么需要使用结构来定义不同的环境和枚举

如果您可以使用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;

为什么需要使用结构来定义不同的环境和枚举

如果您可以使用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;

如果我使用结构,环境的名称和它们的键值是解耦的。然后,我可以在字典中使用这些键值(例如“PROD_SA”),但仍然可以将ProdSa环境定义为Environments.ProdSa。我试图保持我的评论简短,所以我希望它有意义。是的,评论有意义,但我仍然觉得枚举是一个合理的选择。请记住,您可以使用Description属性修饰枚举值,以向枚举中添加文本值,并将该值用作集合中的键。简单地说,这是真的;他们都在工作,都需要反思才能让他们按照我想要的方式工作。使用my Approach以您想要的方式获取它需要反射实际上我不喜欢enum选项,因为字符串值被锁定在反射调用后面。我希望有一些可以轻松用作字典存储/检索的值。要使用枚举,我必须在每次我想这样做时都反映出来。如果我使用结构,环境的名称和它们的键值是解耦的。然后,我可以在字典中使用这些键值(例如“PROD_SA”),但仍然可以将ProdSa环境定义为Environments.ProdSa。我试图保持我的评论简短,所以我希望它有意义。是的,评论有意义,但我仍然觉得枚举是一个合理的选择。请记住,您可以使用Description属性修饰枚举值,以向枚举中添加文本值,并将该值用作集合中的键。简单地说,这是真的;他们都在工作,都需要反思才能让他们按照我想要的方式工作。使用my Approach以您想要的方式获取它需要反射实际上我不喜欢enum选项,因为字符串值被锁定在反射调用后面。我希望有一些可以轻松用作字典存储/检索的值。要使用枚举,我必须在每次我想这样做时都反映出来。谢谢,是GetValue(null)让我大吃一惊。你看了之后觉得有道理,但这是违反直觉的。谢谢,是GetValue(null)让我大吃一惊。在你看了之后是有道理的,但这是违反直觉的。