派生类的基类枚举值?

时间:2009-09-24 20:49:13

标签: c# class

是否可以在不使用反射的情况下从派生类中获取基类的枚举值?

下面的代码使用Reflection,从对象实例获取基类字段值似乎有点过分。

using System;

namespace Seans
{
    public class BaseClass
    {
        public enum eEnum{a, b, c}
    }

    class Program
    {
        static void Main(string[] args)
        {
            DerivedClassA newObject = new DerivedClassA();
            TraverseTheObjectHierachyForTheTaskListEnum(newObject.GetType());

            Console.ReadLine();
        }

        public static Type GetTaskListType(Type type)
        {
            // Handle the cases where our enums are defined in the base class
            return TraverseTheObjectHierachyForTheTaskListEnum(type);
        }

        private static Type TraverseTheObjectHierachyForTheTaskListEnum(Type type)
        {
            foreach (Type nestedType in type.GetNestedTypes())
            {
                if (nestedType.IsEnum)
                {
                    // Enum Name, now you can get the enum values...
                    Console.WriteLine(nestedType.FullName);
                    return nestedType;
                }
            }

            if (type.BaseType != null)
            {
                return TraverseTheObjectHierachyForTheTaskListEnum(type.BaseType);
            }
            return null;
        }
    }
}

2 个答案:

答案 0 :(得分:3)

所以,由于BaseClass中确实没有字段,只是枚举类型定义,因此不太清楚你正在寻找什么。其中任何一个:

Enum.GetValues(typeof(BaseClass.eEnum));

Enum.GetValues(typeof(DerivedClassA.eEnum));

将为您提供枚举的值。如果在编译时不知道枚举的名称,那么反射是唯一的方法。

答案 1 :(得分:1)

上面的代码没有获取字段值,而是获取所有嵌套类型的类型对象。

方法TraverseTheObjectHierachyForTheTaskListEnum中的递归是必要的,因为type.GetNestedTypes()只会返回所提供的实际类型(即DerivedClassA)的类型,而不会返回嵌套在其基类中的任何类型。< / p>

您可以使用调试器逐步调试代码,轻松验证此行为。您不会获得DerivedClassA的任何嵌套类型,但对于基类type.GetNestedTypes()将返回枚举。