2009-09-24 116 views
1

是否有可能從派生類中獲取基類的枚舉值而不使用反射?派生類的基類枚舉值?

下面的代碼使用反射,這似乎有點矯枉過正從對象實例中獲取基類字段值。

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

你想要訪問什麼?對於任何對象實例類型,Enum類型的所有屬性及其相應的可能值?不清楚你想回答什麼問題。 – jro 2009-09-24 21:08:42

+0

是你的權利,一個對象實例的當前值。 – Ferdeen 2009-09-26 20:24:37

回答

3

所以,不完全清楚你正在尋找什麼,因爲在BaseClass中確實沒有字段,只是枚舉類型定義。無論是這些:

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

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

會給你列舉的值。如果您在編譯時不知道枚舉的名稱,那麼反射是唯一的方法。

0

你上面的代碼沒有得到一個字段值,而是所有嵌套類型的類型對象。

方法TraverseTheObjectHierachyForTheTaskListEnum中的遞歸是必要的,因爲type.GetNestedTypes()將只返回實際類型的provicded(即DerivedClassA)類型,但不包含嵌套在其基類中的任何類型。

通過使用調試器逐步執行代碼,可以輕鬆驗證此行爲。你不會得到DerivedClassA的任何嵌套類型,但基類type.GetNestedTypes()將返回枚舉。