2016-08-02 40 views
0

Ich habe gesucht (vielleicht nicht genug), konnte aber keine Antwort finden.C#: Gibt es eine Möglichkeit, ein enum als Argument zu übergeben?

Ich möchte eine generische Funktion machen, wo ich eine Enum mit einem CheckedListBox übergeben kann (erhalten oder setzen Sie den Wert).

public enum TypeFlags 
{ 
    None = 0x0, 
    //List of flag 
} 

private void makeFlagOrBitmask(CheckedListBox list, Type e) 
{ 
    int myFlags = 0x0; 

    //I want to achieve something like that 
    foreach (Object item in list.CheckedItems) 
    { 
     //(TypeFlags)Enum.Parse(typeof(TypeFlags), item); 
     //So e should be the enum himself, but i can't figure how to do that 
     myFlags += (int)((e)Enum.Parse(typeof(e), item.tostring())); 
    } 
} 

So kann ich alle Flags mit einer einzigen Funktion machen/lesen.

Das Problem ist, dass ich nicht herausfinden kann, wie das Enum übergeben wird, wie ich es in der Funktion brauche.

+0

Was läuft schief? – MasterXD

+0

Entfernen Sie typeof (e) und lassen Sie Enum.Parse (e ... Wie ist schon ein Typ? – Andez

+0

'typeof (e)' wenn 'e' ist' Type' wird nur geben Sie Typ Objekt für 'Type' , nicht die Enum-Art. Sie möchten einfach "e" an "Enum.Parse" übergeben. – juharr

Antwort

-1

Sie möchten diese Zeile ändern:

myFlags += (int)((e)Enum.Parse(typeof(e), item.tostring())); 

In diese:

myFlags += (int)((e)Enum.Parse(e, item.tostring())); 

Da e ist bereits eine Art. Wie man den Parameter übergibt:

makeFlagOrBitmask(myCheckBoxList, typeof(myEnum)); 

Ich hoffe, dass dies hilft.

EDIT:

Um sicherzustellen, dass nur Aufzählungen diese an die Spitze Ihrer Funktion zu machen umgehen, fügen:

if (!e.IsEnum) 
    return; 
+0

Dies ermöglicht es Ihnen, Typen zu übergeben, die nicht enums sind. – Servy

+0

Das ist, was ich brauchte, wie ich oben sagte. Vielen Dank ! –

+0

@SiveurWesttunger Großartig, ich habe eine Bearbeitung vorgenommen, also schau es dir an. Könnten Sie meine Antwort auch akzeptieren? Das wäre großartig. Vielen Dank. – MasterXD

0

nicht vollständig sein könnte, aber es klingt wie Sie eine generische Enum Iterator brauchen . Ich nahm den Code unten aus Create Generic method constraining T to an Enum bis

public T GetEnumFromString<T>(string value) where T : struct, IConvertible 
{ 
    if (!typeof(T).IsEnum) 
    { 
     throw new ArgumentException("T must be an enumerated type"); 
    } 

    //... 
} 
0

Ich weiß, das kein schöner-Code ist aber das funktioniert für mich:

Wenn die Methode ein Objekt anstelle einem Typ will (vielleicht können Sie dies mit ein Typ) Sie es wie folgt tun:

Sie können
if (e.GetType() == typeof(ImageType)) 
    { 
     ValueArray = GetEnumArray(ImageType.Bmg); 
    } 

Auf diese Weise überprüfen, was Enum it es, bevor Sie etwas tun.

Ich hoffe, das kann Ihnen helfen.