Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.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从带有反射的嵌套类中获取常量_C#_Reflection_Constants - Fatal编程技术网

C# C从带有反射的嵌套类中获取常量

C# C从带有反射的嵌套类中获取常量,c#,reflection,constants,C#,Reflection,Constants,我想从嵌套类中的所有常量创建一个列表 public struct SomePair { public string Name, Value; public SomePair(string name, string value) { Name = name; Value = value; } } private static MemberInfo[] GetClasses() => typeof(MainFoo).GetMe

我想从嵌套类中的所有常量创建一个列表

public struct SomePair
{
    public string Name, Value;

    public SomePair(string name, string value)
    {
        Name = name;
        Value = value;
    }
}

private static MemberInfo[] GetClasses() => typeof(MainFoo).GetMembers(BindingFlags.Public);
private static List<Type> GetClassTypes() => GetClasses().Select(c=>c.GetType()).ToList();

public static class MainFoo
{
    // The return value should contain the information about the SomeConstant's from both Errors and Foo.
    public static List<LocalizationPair> Dump()
    {
        List<SomePair> Dump = new List<SomePair>();
        var classes = GetClassTypes();
        foreach (Type cls in classes)
        {
            var constants = cls.GetFields(BindingFlags.Public); // <<< Is always empty...
            foreach (FieldInfo constant in constants)
            {
                Dump.Add(new SomePair(
                    $"{cls.Name}.{constant.Name}",
                    constant.GetValue(cls).ToString()
                    ));
            }
        }

        return Dump;
    }
    
    public static class Errors
    {
        public constant string SomeConstant = "a";
    }
    
    public static class Foo
    {
        public constant string SomeConstant = "a";
    }
}

我可以获取所有类的列表和所有类类型的列表,但一旦我尝试在这些类上使用GetMember,它将不会返回任何结果。

使用GetNestedTypes,而使用公共常量的正确绑定标志:

var nestedTypes = typeof(MainFoo).GetNestedTypes(BindingFlags.Public);
foreach (Type type in nestedTypes)
{
    FieldInfo[] constants = type.GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static);
    // <do stuff here>
}

我在任何地方都看不到对GetNestedTypes的调用,所以从那里开始。其次,您需要包括BindingFlags.Instance和/或BindingFlags.Static以获得任何结果。常量是静态成员。第三,.Selectc=>c.GetType将从序列中投影RuntimeFieldInfo、RuntimePropertyInfo等的类型实例。您需要将每个项目c强制转换为FieldInfo、PropertyInfo等,具体取决于它是哪个项目,并分别获得FieldType或PropertyType属性。这将不是一个简单的lambda表达式。谢谢,这就解决了它。我甚至不知道这个方法的存在。请不要只发布代码作为答案,还要解释代码的作用以及它如何解决问题。带有解释的答案通常更有帮助,质量更好,更容易吸引选票。