Getting all public constants from the main and nested classes I wrote this recursive function to get all constants from a class and its subclasses. Can it be simplified?

private static IEnumerable&lt;FieldInfo&gt; 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 =&gt; fi.IsLiteral &amp;&amp; !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.
How about this:

private static IEnumerable&lt;FieldInfo&gt; GetPublicConstants(Type type)
{
    return GetPublicClassConstants(type)
        .Concat(type.GetNestedTypes(BindingFlags.Public).SelectMany(GetPublicConstants));
}

private static IEnumerable&lt;FieldInfo&gt; GetPublicClassConstants(Type type)
{
    return type
        .GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy)
        .Where(fi =&gt; fi.IsLiteral &amp;&amp; !fi.IsInitOnly);
}


OR, as I do enjoy playing PGA Pro Code Golf:

private static IEnumerable&lt;FieldInfo&gt; GetPublicConstants(Type type)
{
    return type
        .GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy)
        .Where(fi =&gt; fi.IsLiteral &amp;&amp; !fi.IsInitOnly)
        .Concat(type.GetNestedTypes(BindingFlags.Public).SelectMany(GetPublicConstants));
}