Ist es möglich, speichern Sie eine Typ (mit "typeof()") in einem enum?
So, ich bin momentan dabei, ein Spiel in XNA, C# 4.0, und ich brauchen, um zu verwalten eine Menge von Power-UPS (die im code sind alle geerbt von der Klasse "PowerUp"), und mit back-end-management von der Power-UPS im Moment habe ich ein enum, PowerupEffectType, mit einem Wert für jede Kind-Klasse von PowerUp. Schließlich der code, den ich brauche, um Konvertierungen aus PowerupEffectType, um die Powerup-Typ (der Klasse Type
, erzielt in der Regel mit typeof([class name])
).
Da diese Gruppe ist ein Projekt, das ich heiraten will, jeder Wert PowerupEffectType seiner entsprechenden Klasse, die Geben so gut wie möglich, d.h.: Nicht nur erwarten, dass meine andere Programmierer verwenden Sie switch-Anweisungen, um die Konvertierung manuell, und sicherstellen, dass Ergänzungen/Erweiterungen später mit einbeziehen, so wenige änderungen in so wenigen Orten wie möglich. Ich habe ein paar Optionen für diese, und die beste, die ich entdeckt habe, so weit ist das erstellen enum pseudo-Methoden, die alles verdichten zu einer einzigen switch-Anweisung (99% von dem, was ich will), Dank einiger Tipps habe ich hier gefunden: http://msdn.microsoft.com/en-us/library/bb383974.aspx
Aber ich versuche, mich zu nehmen es ein Schritt weiter - kann ich sparen Type
in einem enum
? Ich weiß, Sie können speichern Enumerationen, die als ein bestimmter Typ (link: http://msdn.microsoft.com/en-us/library/cc138362.aspx), aber Type
ist nicht einer von Ihnen. Die aktuellen Entscheidungen sind byte, sbyte, short, ushort, int, uint, long und ulong. Gibt es eine praktikable Möglichkeit, zu sparen konvertieren Type
einem der oben genannten Datentypen und zurück?
Nur klar zu sein, das ist, was ich WÜNSCHTE, ich könnte tun, und ich bin auf der Suche nach einem Weg, das zu tun:
//(Assuming 'LightningPowerup', 'FirePowerup', and 'WaterPowerup' are
//all declared classes that inherit from a single base class)
public enum PowerupEffectType
{
LIGHTNING = typeof(LightningPowerup),
FIRE = typeof(FirePowerup),
WATER = typeof(WaterPowerup)
}
Gibt es eine Möglichkeit, dies zu tun, oder bin ich einfach nur overcomplicating eine Lösung zu einem problem, das bereits zu 99% abgeschlossen?
Vielen Dank im Voraus!
- Ich weiß nicht, was Sie versuchen zu erreichen, hier, wie Ihr Ultimatives Ziel, aber es riecht wie etwas, das Sie sollten erreichen können, die mit einer virtuelle Methode statt der Umstellung auf ein enum. In der Regel der Grund, warum Sie wollen würde, um zu bekommen eine Art von enum, als Sie tun, ist, wenn die enum-kommt von einer externen Quelle, wahrscheinlich die DB. Aber in diesem Fall möchten Sie wahrscheinlich Ihre switch-block zu instanziieren des powerup geben, anstatt Ihnen die entsprechende class-Objekt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie es nicht als Wert einer enum, aber könnten Sie es in ein Attribut:
Können Sie dann extrahieren Sie diese Attributwerte zur Laufzeit mit reflection. Allerdings würde ich persönlich erstellen Sie einfach ein Wörterbuch:
Keine Notwendigkeit für ein spezielles Attribut, keine Notwendigkeit, Sie zu extrahieren Sie die Werte mit fummelig Reflexion-code.
Dies ist nicht genau das, was u Fragen. Ich finde Jon ' s-Attribut-Methode die beste. Aber warum nicht wickeln Sie es in eine extension-Methode?
Und nennen es:
Wie wäre es mit etwas wie das?
Erhalten Sie die Typ-Sicherheit, dass Sie mit enum, plus eine implizite Konvertierung zum Typ
completionlist
kann verwendet werden, um enum-Stil auto-Vervollständigung für diese Art – aber leider nur in VB, nicht für C#.Könnte man eine
static Dictionary<PowerupEffectType, Powerup>
. Ich glaube, das wäre die Art von "Ehe", die Sie suchen. Es würde erlauben die einfache Aufzählung und Zugang.Könnten Sie nur numerische Typen, wie durch die Dokumentation von Microsoft. Standardmäßig ist der zugrunde liegende Typ der einzelnen Elemente in der enum ist int. Sie können angeben, dass ein anderes integral numerische Typ mit einem Doppelpunkt, wie im vorherigen Beispiel gezeigt. Für eine vollständige Liste der möglichen Typen, siehe enum. "Referenz: Enumeration Types
Sorry, ich verstehe nicht ganz Folgen, was du eigentlich zu erreichen versuchen; könnte Sie geben einen code-Auszug? Ich bin mir nicht sicher, warum können Sie nicht einfach die Vererbung hier, und was eine enumeration gibt Sie, die Art der Vererbung nicht. Es fühlt sich für mich an wie Sie mit der Präsentation der Lösung und nicht als das problem, ich kann vollkommen falsch sein, könnte Sie klären, wie Sie planen, verwenden Sie diese meta-Informationen?
Ich bin verwirrt, du fragst nach etwas, das Ihnen sagt, den Typ einer Instanz eines Typs/Klasse? Sie können eine Aufzählung zur Speicherung einer Liste der Typen, die von jeder Art, dass Sie sagen, aber warum wollen Sie? Sie sagen, Sie wollen nicht, dass die anderen Programmierer verwenden Sie switch-Anweisungen, aber tut mir Leid, ich kann nicht sehen, was Sie profitieren immer von einer Speicherung der Typinformationen in einigen Aufzählung von... der Typ. Jede Instanz kennt, welche Art es ist und was es kann.
Was werden Sie tun, mit der Art von Informationen? Wenn die Typen Erben alle von einem Basis-Typ, dann vermutlich haben Sie Allgemeine Funktionen, die angegeben werden können, in einem
abstract
Methode für jede Besondere-case-handling, oder vielleicht zurückgebenNull Object
wo es nichts zu tun (oder vielleicht einfach nur nichts tun). Auf diese Weise brauchen Sie nicht zu sorgen über das hinzufügen von neuen Klassen, wie Sie müssen über die erforderlichen Verhaltens. Ich versuche zu vermeidenEnum
s außer in Situationen, in denen Sie tatsächlich Aufzählung einer bestimmten Anzahl von beliebigen Werten, Sie sind unflexibel.Enum
s die gepflegt werden müssen, was sehr schwierig ist (in der Praxis).Eigentlich denke ich, möchten Sie vielleicht einen Blick auf ein dependency injection framework.
Es sieht aus wie Sie versucht, die anderen Entwickler arbeiten an verschiedenen Komponenten und dann Sie versuchen, zu integrieren, Sie alle am Ende in einer zentralen Lage in der code-Basis.
Wenige Projekte zu betrachten: