2016-05-31 5 views
0

ich eine Methode für Aufzählungen, die wie folgt aussieht:Best Practice für TryGet Methode Stil

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

    Type type = typeof(TEnum); 
    FieldInfo[] fieldInfos = type.GetFields(); 
    foreach (FieldInfo fieldInfo in fieldInfos) 
    { 
    StringValue[] stringValues = fieldInfo.GetCustomAttributes(typeof(StringValue), false) as StringValue[]; 
    if (stringValues != null) 
    { 
     foreach (StringValue stringValue in stringValues) 
     { 
     if (stringValue.Value.Equals(value)) 
     { 
      return (TEnum)Enum.Parse(typeof(TEnum), fieldInfo.Name); 
     } 
     } 
    } 

    } 
    throw new ArgumentOutOfRangeException("value", "Value was not found in enum's string values."); 
} 

Ich mag würde ein TryGetEnumByStringValue implementieren, die wahr oder falsch zurückgibt, anstatt eine Ausnahme von dem Konzept ähnlich zu werfen von int.Parse und int.TryParse. So wie ich es sehe, könnte ich in meiner neuen Methode einfach meine andere anrufen, die Ausnahmen (falls vorhanden) abfangen und entsprechend zurückkehren, oder ich könnte die vorhandene umformulieren, um bool zurückzukehren und wieder in meiner neuen Methode einfach die existierende aufzurufen und eine Ausnahme auslösen, wenn sie false zurückgibt.

Wenn ich mit Option 2 gehe, verliere ich genaue Ausnahmedetails, und wenn ich mit Option 1 gehe, werden die Ausnahmen noch geworfen (ich habe immer gelernt, Ausnahmen sind langsam).

Ich könnte auch das bestehende umgestalten, um eine bool zu nehmen, die angibt, ob Ausnahmen zu werfen oder nicht, aber das stimmt nicht ganz richtig mit mir.

Gibt es eine Perle der Weisheit, die ich für diese Art von Methodenstil oder Muster vermisst habe?

+0

Ich würde einfach die Methode verwenden, die Sie bereits haben, keine Notwendigkeit, die gesamte Logik zu kopieren, einfach wieder verwenden – Fabjan

+0

Bitte überprüfen Sie den folgenden Link als Beispiel: [link] (http://stackoverflow.com/questions/15294878/how-the-int-tryparse-tatsächlich-funktioniert) "int" verwendet es auch wieder. –

+0

Ihre Idee, ein Bool zu übergeben, um anzugeben, ob es zu werfen wäre, könnte auf eine private Methode angewendet werden, und dann würden Ihre öffentlichen Methoden das mit dem entsprechenden Bool aufrufen. – juharr

Antwort

0

Wenn Sie bereits eine Methode, die wirft, dann ist es einfach zu Try... Variante davon mit ... Überraschung! try/catch:

public bool TryReturnSomething(..., out SomeType result) // ... - parameters 
{ 
    try 
    { 
     result = ReturnSomething(); 
     return true; 
    } 
    catch(SomeException1 e) { } // catch all expected exception types 
    catch(SomeException2 e) { } 

    return false; 
} 

Blick in sources werden Sie feststellen, dass in der Tat Miscrosoft Art von Muster verwendet wird. Sie haben interne Methode, die mit validierten Parameter aufgerufen wird. Und Validierung erfolgt individuell durch Try... und normale Variante. Siehe z.B. double.Parse() und double.TryParse(), erste wird throw bei der Validierung und andere Rückkehr false.

Also, wenn Sie eine private Methode erstellen können, die Sie von beiden Varianten aufrufen. Diese Methode sollte nichts validieren (kann Ausnahme auslösen) und diese Methode in öffentlichen Varianten aufrufen, die beide Parameter validieren (Try.. gibt false und andere Würfe zurück).