Moin
Ich hoffe, mein Titel ist halbwegs tauglich, etwas besseres viel mir nicht ein.
Zu meiner Frage:
Ich möchte alle möglichen Schulfächer in einem (oder mehrere) Enums zusammen fassen.
Allerdings gibt es da das Problem, dass es Haupt- und Nebenfächer, Naturwissenschaften und Sprachen, etc. gibt.
Also verschiedene Zuordnungen des Faches und die möchte ich alle in einem Enum zusammen fassen können.
Bei Klassen gibt es ja so etwas ähnliches. Als Beispiel:
C#-Quelltext
1: 2: 3:
| interface IAuto {} class PKW : IAuto {} class LKW : IAuto {} |
Wenn ich das auf ein paar Fächer umsetze:
C#-Quelltext
1: 2: 3: 4: 5: 6:
| interface IFach{} interface ISprache {} interface INaturwissenschaft{} class Englisch : IFach, ISprache {} class Biologie : IFach, INaturwissenschaft {} class Deutsch : IFach, ISprache {} |
Das möchte ich auch bei einem Enum haben, dass z.B. in Methode1 ein Fach, also einen Typ, der IFach implementiert, als Parameter erwarte und in Methode2 erwarte ich zwar ein Fach, allerdings soll es eine Sprache sein, also IFach und ISprache implementieren.
Gibt es eine Möglichkeit, das zu realisieren?
Ich möchte nicht für jede falsche Variante immer eine Exception zurück geben müssen. Das ist dann sowohl beim Schreiben der Methode, als auch der Verwendung und dem Abfangen dann schon aufwendig.
So, wie ich das bis jetzt sehe, ist die einzige Möglichkeit, ein Attribut zu schreiben, welches dann den Typ des Faches enthält.
So bekomme ich zumindest jedem Fach alle Infos mit gegeben, aber gibt es nicht eine einfachere und weniger aufwendige Möglichkeit, wie es auch bei den Klassen möglich ist und dass ich am Ende auch einen Compiler-Fehler bekomme, wenn ich das falsche Fach angegeben habe. Eben, wenn ich anstelle des tatsächlichen Typs einfach die Schnittstelle angebe, die das Fach dann implementiert.
Ich poste gleich noch den Code, wie ich das eben mit Hilfe eines Attributes gelöst habe.
Wer noch nicht verstanden hat, was ich meine, vielleicht wird es dann ja klar.
Hier mein Code:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35:
| public enum SubjectType { Hauptfach, Nebenfach, Naturwissenschaft, Sprache, Andere }
[AttributeUsage(AttributeTargets.Field, Inherited = false, AllowMultiple = true)] public sealed class SubjectTypeAttribute : Attribute { readonly SubjectType _SType; public SubjectTypeAttribute(SubjectType SType) { this._SType = SType; } public SubjectType SType { get { return SType; } } }
public enum Subject { [SubjectType(SubjectType.Sprache)] [SubjectType(SubjectType.Hauptfach)] Deutsch, [SubjectType(SubjectType.Hauptfach)] [SubjectType(SubjectType.Naturwissenschaft)] Mathematik
} |
Dabei habe ich dann aber das Problem, dass ich die Attribute nicht abfragen kann. So habe ich es versucht:
C#-Quelltext
1: 2: 3: 4: 5:
| SubjectTypeAttribute[] attr = (SubjectTypeAttribute[])Attribute.GetCustomAttributes(Subject.Deutsch.GetType(), typeof(SubjectTypeAttribute)); foreach (var item in attr) { Console.WriteLine(Enum.GetName(typeof(SubjectType), (object)item.SType)); } |
Allerdings passiert da gar nichts, ich bekomme also kein einziges Attribut angezeigt, obwohl ja eigentlich zwei gezeigt werden müssten.
Ich hoffe mir kann jemand, wenn nicht im ersten, dann halt im zweiten Problem, helfen.
Gruß