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表达式。谢谢,这就解决了它。我甚至不知道这个方法的存在。请不要只发布代码作为答案,还要解释代码的作用以及它如何解决问题。带有解释的答案通常更有帮助,质量更好,更容易吸引选票。