2016-08-09 59 views
0

ich in meiner Klasse einige Enum sind bekam, dann ist es so aussieht diese:Set Eigenschaft von String angegeben Aufzählungstyp

public enum A { A1, A2 } 
public enum B { B1, B2 } 

Problem ist, wenn ich versuche, Elemente aus XML-Datei (jedes Feld von Eigenschaftsnamen zu lesen gegeben und Eigenschaftswert - beide Zeichenfolgen).

Jetzt habe ich meine Methode, die Wert der einzelnen Eigenschaft (es gibt nur einen Teil mit IsEnum überprüfen).

public A classfield 
{ 
    get; 
    set; 
} 
public bool DynamicallySetItemProperty(string name, string value) 
{ 
    // value = "A1" or "A2"; - value given in string. 
    // name = "classfield"; - name of property. 
    PropertyInfo p = this.GetType().GetProperty(name); 
    if (p.PropertyType.IsEnum) 
    { 
    var a = (A) Enum.Parse(typeof(A), value); 
    p.SetValue(this, a); 
    } 
    return true; 
} 

Aber in diesem ich nicht überprüfen, ob Feld A oder B-enum ist.

Gibt es eine Möglichkeit, meine Methode Prüfung Art von ENUM zu machen und dann meine Zeichenfolge zu diesem Enum-Parsing, so etwas wie diese:

public bool DynamicallySetItemProperty(string name,string value) 
{ 
    PropertyInfo p = this.GetType().GetProperty(name); 
    if (p.PropertyType.IsEnum) 
    {  
    var a = (p.GetType()) Enum.Parse(typeof(p.GetType()), value); // <- it doesn't work 
    p.SetValue(this, a); 
    } 
    return true; 
} 

i Eigenschaft für seinen Aufzählungstyp So müssen prüfen, und dann Parsen Sie meinen String-Wert zu diesem Enum-Typ ohne If/Else oder Switch-Anweisung (es ist problematisch, wenn ich eine Menge von Enum-Typen). Gibt es einen einfachen Weg, es zu tun?

Antwort

2

Es besteht keine Notwendigkeit, um die Art zu überprüfen. Enum.Parse() nimmt den Typen als erste Parameter und die Art benötigen Sie ist p.PropertyType (da dies die Art der Immobilie. SetValue() ein object als Parameter für den Wert nimmt sowieso, so gibt es keine Notwendigkeit, den Rückgabewert von Enum.Parse() zu werfen :

PropertyInfo p = this.GetType().GetProperty(name); 
if (p.PropertyType.IsEnum) 
    p.SetValue(this, Enum.Parse(p.PropertyType, value)); 

Hinweis dass p.GetType() die Type Instanz für PropertyInfo zurückgibt, nicht die Aufzählungstyp

+0

Blick auf op-Anweisung: * "jedes Feld durch Eigenschaftsname und Eigenschaftswert angegeben - beide Zeichenfolge" * - wie haben Sie einen Typ? Woher weißt du, dass es enum ist? – Sinatr

+1

@Sinatr Sie erhalten eine 'PropertyInfo' für die Eigenschaft, die wie das OP über' this.GetType(). GetProperty (name) 'gesetzt wird. Diese 'PropertyInfo' hat eine Eigenschaft' PropertyType', die _der Typ der Eigenschaft_ ist. 'Enum.Parse()' erwartet genau diese Typinstanz als ersten Parameter. Es ist keine generische Methode, es benötigt kein Typliteral, sondern eine Instanz von 'Type', die den Typ repräsentiert. –

+1

@Sinatr Und ich weiß, es ist eine Enum, weil 'p.IsEnum' wahr ist. –

0

Das brauchen Sie nicht, weil PropertyInfo.SetValue eine Instanz von object als zweiten Parameter erwartet. Sie müssen also won't Pflege auf den speziellen Typ zu nehmen und einfach diese verwenden:

var parsedValue = Enum.Parse(p.PropertyType, value); 
p.SetValue(this, parsedValue, null);