Frage

für verschiedene Formatierungsoptionen auf ein Verfahren zu ermöglichen, die eine Story zeigt, habe ich eine Aufzählung erstellt, die übergeben werden können, um festzulegen, wie es angezeigt wird.

[Flags]
private enum NewsStyle
{
    Thumbnail = 0,
    Date = 1,
    Text = 2,
    Link = 4,
    All = 8
}

string FormatNews( DataRow news, NewsStyle style )
{
    StringBuilder HTML = new StringBuilder();

    // Should the link be shown
    if ( ((newsStyle & NewsStyle.All) == NewsStyle.All || (newsStyle & NewsStyle.Link) == NewsStyle.Link))
    {
                HTML.AppendFormat("<a style=\"text-decoration:none; color: rgb(66, 110, 171);\" href=\"ViewStory.aspx?nsid={0}\">",
                                  UrlEncode(newsStory["NewsStoryID"].ToString()));
    }

    // Etc etc...
}

// So to call the method...
Response.Write( FormatNews( news, NewsStyle.Date | NewsStyle.Text ) );

Das Problem ist, dass ich nur der Code bekommen arbeiten, wenn ich manuell die Werte auf dem ENUM angeben, da sonst der bitweise Enum Prüfvorgang nicht richtig funktioniert.

Ich habe immer die Regel lassen gefolgt .net die Zuweisung von Werten zu Aufzählungen behandeln - das ist eine geniuine Ausnahme

War es hilfreich?

Lösung

Ja, es ist eine echte Ausnahme. Aufzählungen sind standardmäßig zugeordneten Werte von 0 ab, die jeweils um 1 höher als der vorherige Wert, unabhängig von irgendwelchen FlagsAttributes. (Es gibt natürlich sind aufwendigere Regeln für, wenn Sie einige Werte manuell angeben - siehe MSDN-Dokumentation )

Während es tut etwas Sinn machen, eine Fahne haben Aufzählung automatisch Werte in Zweierpotenzen, ich Gründe, warum es wahrscheinlich am besten, dies nicht zu tun:

Es ist durchaus sinnvoll, eine Enum wie diese haben:

[Flags]
enum Foo
{
    None,
    Bar,
    Baz, 
    BarAndBaz
} 

Dies erfordert natürlich die Werte 0 sein, 1, 2 und 3 sinnvoll.

Es wäre ziemlich kontraintuitiv das Vorhandensein eines bloßen Attribut lassen die gesamte Bedeutung eines Stückes von C # -Code ändern. Betrachten Sie meine Foo Beispiel Aufzählung. Sollte das Flags Attribut Entfernen erlaubt werden, um den Code zu brechen, indem sie die Aufzählungswerte leise zu ändern?

Andere Tipps

Ja, müssen Sie die Werte in der Enum geben die zusätzlichen Flag-Werte zu erhalten, richtig zu arbeiten (können zwei Enum-Flags kombinieren und diesen Wert nicht Konflikt mit einem anderen Flag angegeben). Sie müssen keine Werte angeben, um es zu kompilieren, aber das Ergebnis wird höchstwahrscheinlich nicht die, die Sie suchen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top