windows - Liste over værdier inden for enums ved brug af refleksion i C #

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at bruge refleksion til at liste de offentlige medlemmer og metoder til et par klasser i forskellige projekter inde i en Visual Studio-løsning. Alle de klasser, jeg forsøger at få adgang til, er C #, og de er alle tilgængelige fra en C # klasse. Koden jeg bruger til at foretage disse opkald er som følger:


public void PopulateEventParamTree()
    {
        System.Console.WriteLine(source.GetType().ToString());
        Type type = (Type)source.getEventType();
        System.Console.WriteLine(type.ToString());

        foreach (MemberInfo member in type.GetMembers())
        {
            System.Console.WriteLine("	" + member.ToString());
        }
    }


De fleste af udgange virker fint (dvs. Int32, Double, System.String). Mit problem er, at når jeg prøver at liste enums får jeg en udgang til konsollen, der ser sådan ud:


Namespace.Subspace.event+EVENT\_TYPE


Jeg vil gerne kunne se alle indre indre værdier i stedet for blot dets navn. For eksempel er enummen


public enum EVENT\_TYPE
{
    EVENTDOWN,
    EVENTMOVE,
    EVENTUP,
}


bør udstille noget som dette


Namespace.Subspace.class+EVENT\_TYPE EVENTDOWN
Namespace.Subspace.class+EVENT\_TYPE EVENTMOVE
Namespace.Subspace.class+EVENT\_TYPE EVENTUP


Enhver hjælp, som nogen kan tilbyde, vil blive meget værdsat. Jeg har udtømt alt, hvad jeg har kunnet finde hidtil, men et nyt perspektiv ville være rart.


Tak

Bedste reference


Brug System.Enum.GetNames(typeof(EVENT\_TYPE)). [8]


du vil sandsynligvis skulle behandle denne særlige sag (ikke bruger refleksion for enums).

Andre referencer 1


hvordan man får enum og værdier via refleksion


var importAssembly = System.Reflection.Assembly.LoadFile("test.dll");     
Type[] types = importAssembly.GetTypes();
     foreach (Type type in types)
        {
        if (type.IsEnum)
        {
               var enumName=type.Name;
               foreach (var fieldInfo in type.GetFields())
               {
                  if (fieldInfo.FieldType.IsEnum)
                  {
                      var fName=fieldInfo.Name;
                      var fValue=fieldInfo.GetRawConstantValue()
                  }
              }
         }
    }

Andre referencer 2


Enums er implementeret som offentlige statiske readonly felter (sandsynligvis også const); Din nuværende kode skal fungere ... Du skal bare få navnet fra FieldInfo. Og ring til GetValue, hvis du vil have værdien.


Men Enum.GetValues ​​(type) er nemmere ...

Andre referencer 3


Så i dit tilfælde at kontrollere, om kilden er en enum type og derefter kalde GetEnumNames () ville tillade koden at handle på klasser, enums osv.


    private void Work()
    {
        var type = typeof(numbers);

        string [] members;

        if(type.IsEnum)
            members = typeof(numbers).GetEnumNames();
    }

    public enum numbers
    {
        one,
        two,
        three,
    }