\$\begingroup\$
\$\endgroup\$
I wrote this recursive function to get all constants from a class and its subclasses. Can it be simplified?
private static IEnumerable<FieldInfo> GetPublicConstants(Type type)
{
var subtypes = type.GetNestedTypes(BindingFlags.Public);
foreach (var subtype in subtypes)
{
foreach (var constant in GetPublicConstants(subtype))
{
yield return constant;
}
}
var publicStaticFields = type.GetFields(BindingFlags.Public |
BindingFlags.Static | BindingFlags.FlattenHierarchy)
.Where(fi => fi.IsLiteral && !fi.IsInitOnly);
foreach (var fieldInfo in publicStaticFields)
{
yield return fieldInfo;
}
}
For example, it would return 6 constants for the following class:
public static class MyClass { public const string AAA = ""; public static class A { public const string Aaaaa = ""; public static class AB { public const string ABaaa = ""; } } public static class B { public const string Baaa = ""; public const string Bbbb = ""; } public static class C { public const string Caaa = ""; } }
What I don't like is the fact I'm having 2 loops where I yield return 1 item because of inability to yield return a list of items.
Jamal
35.2k13 gold badges134 silver badges238 bronze badges
asked Aug 19, 2015 at 16:04
1 Answer 1
\$\begingroup\$
\$\endgroup\$
2
How about this:
private static IEnumerable<FieldInfo> GetPublicConstants(Type type)
{
return GetPublicClassConstants(type)
.Concat(type.GetNestedTypes(BindingFlags.Public).SelectMany(GetPublicConstants));
}
private static IEnumerable<FieldInfo> GetPublicClassConstants(Type type)
{
return type
.GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy)
.Where(fi => fi.IsLiteral && !fi.IsInitOnly);
}
OR, as I do enjoy playing PGA Pro Code Golf:
private static IEnumerable<FieldInfo> GetPublicConstants(Type type)
{
return type
.GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy)
.Where(fi => fi.IsLiteral && !fi.IsInitOnly)
.Concat(type.GetNestedTypes(BindingFlags.Public).SelectMany(GetPublicConstants));
}
answered Aug 19, 2015 at 20:33
-
\$\begingroup\$ sorry, didn't understand the PGA reference however 2nd solution is ace! \$\endgroup\$Иван Грозный– Иван Грозный2015年08月20日 14:59:14 +00:00Commented Aug 20, 2015 at 14:59
-
\$\begingroup\$ @Tsar "Professional Golfers Association" and code golf is the art/game of making the code as small as possible. \$\endgroup\$Jesse C. Slicer– Jesse C. Slicer2015年08月20日 18:32:42 +00:00Commented Aug 20, 2015 at 18:32
lang-cs