是否可以在不使用反射的情况下从派生类中获取基类的枚举值?
下面的代码使用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;
}
}
}
答案 0 :(得分:3)
所以,由于BaseClass中确实没有字段,只是枚举类型定义,因此不太清楚你正在寻找什么。其中任何一个:
Enum.GetValues(typeof(BaseClass.eEnum));
或
Enum.GetValues(typeof(DerivedClassA.eEnum));
将为您提供枚举的值。如果在编译时不知道枚举的名称,那么反射是唯一的方法。
答案 1 :(得分:1)
上面的代码没有获取字段值,而是获取所有嵌套类型的类型对象。
方法TraverseTheObjectHierachyForTheTaskListEnum
中的递归是必要的,因为type.GetNestedTypes()
只会返回所提供的实际类型(即DerivedClassA)的类型,而不会返回嵌套在其基类中的任何类型。< / p>
您可以使用调试器逐步调试代码,轻松验证此行为。您不会获得DerivedClassA
的任何嵌套类型,但对于基类type.GetNestedTypes()
将返回枚举。