Frage

Ich habe eine öffentliche statische Eigenschaft in einer Klasse. Die Klasse hat einige benutzerdefinierte Attribute auf sie angewendet. Ich möchte das Attribut in einer statischen Eigenschaft zuzugreifen.

In einem nicht-statisches Element kann ich die Art der aktuellen Klasse bekommen mit this.GetType (), aber wie mache ich das in einem statischen Element der Klasse?

Bitte beachten Sie, dass ..

  • Ich will nicht verwenden typeof (Typname) auf Grund Vererbung Fragen. [Ich werde haben Diese Eigenschaft geerbt abgeleiteten Klassen.].

  • Ich will auch nicht verwenden Generics als gut.

EDIT

Hier ist mein Ziel.

Ich habe eine abstrakte Basisklasse genannt EntityBase. Alle meine Einheiten von dieser Klasse ableiten. Jede Einheit trägt auch ein benutzerdefiniertes Attribut namens TableMappingAttribute, die mir die Tabelle lässt wissen, dass es bezieht sich / Karten zu, während der Laufzeit. Ich habe bereits eine Immobilie in EntityBase, die mir die abgebildeten Tablename für die Entität zurückgibt.

Ich muß immer eine Instanz von Unternehmen der Tablename-Eigenschaft zuzugreifen. Ich möchte diese Eigenschaft zuzugreifen statisch irgendwann, wie MyEntity.TableName. Ich habe große Menge Einheiten in meinem Projekt. Ich mag diese statische Eigenschaft in EntityBase Klasse hinzugefügt werden, selbst. Also muss ich den Typ zur Laufzeit entdecken. Wie kann ich tun dies in EntityBase Klasse selbst ??

Thnaks.

War es hilfreich?

Lösung

Sie können nicht, im Grunde. typeof (...) ist , was Sie verwenden müssen.

Beachten Sie, dass, wenn Sie versuchen, zu verwenden:

Type type = MyDerivedType.SomeStaticProperty;

welches deklarierte in MyBaseType, die tatsächlich bis enden wird zu

kompiliert
Type type = MyBaseType.SomeStaticProperty;

sowieso. Statische Elemente sind grundsätzlich nicht polymorph. Wenn Sie sie versuchen polymorph zu verwenden, werden Sie Probleme wie diese ausgeführt werden.

EDIT: Also von Ihrem bearbeiten, es sieht aus wie Sie versuchen, genau die oben Art der Sache zu tun, mit

MyEntity.TableName

statt

EntityBase.TableName

Es wird einfach nicht funktionieren. Der Compiler Code emittieren, um EntityBase.TableName zu holen. Die Laufzeit hat kein Konzept von „der aktuellen Klasse“. Es gibt keinen Zusammenhang hier.

Im Grunde müssen Sie Ihren Entwurf ändern. Wenn Sie die Vererbung verwenden möchten, sollten Sie eine parallele Hierarchie haben - eine für die Metadaten (Dinge wie Tabellennamen) und eine für den eigentlichen Objekten. So müßten Sie so etwas wie:

public class MyEntity : EntityBase<MyEntityType>

wobei MyEntityType leitet sich von EntityType in der parallelen Hierarchie. Dann sind Sie können Verwendung Vererbung innerhalb der Metadaten-Hierarchie.

Alternativ einfach machen EntityBase generic sowieso lassen Sie bei der Art des Unternehmens erhalten Sie sprechen:

public class MyEntity : EntityBase<MyEntity>

Ich weiß, Sie sagen, Sie nicht Generika verwenden wollten, sondern als das, was Sie tun wollen einfach nicht funktionieren, sollten Sie es zumindest betrachten ...

Andere Tipps

  

Ich will nicht typeof (Typname) verwenden, aufgrund Erbschaftsangelegenheiten.

statische Eigenschaften werden nicht vererbt im üblichen Sinne. Sicher, sie sind im Rahmen, aber das ist nicht das gleiche. Der einzige Weg, zu bekommen, was Sie auf dem Stack-Frame aussehen würden sein wollen, aber das ist hässlich und Hacky (und riskant, wenn Optimierungen aktiviert sind).

ich für eine Lösung Refactoring würde, der die instace verwendet ... Instanz eine Type.

Sie können die System.Diagnostics.StackFrame Klasse in einer statischen Methode wie folgt verwendet werden:

StackFrame currentStackFrame = new StackFrame();
Type type = currentStackFrame.GetMethod().DeclaringType;

Sie müssen nicht über Vererbung zur Sorge, wenn die Eigenschaft static ist; es kann nicht außer Kraft gesetzt werden, so wird es sowieso immer in der Basisklasse deklariert werden. Mit typeof ist der Weg zu gehen.

Wenn Sie nicht wollen, typeof () verwenden, dann bist du kein Glück, denn das ist der einzige Weg, um das Type-Objekt einer statischen Klasse zu erhalten (es sei denn, Sie die Art finden wollen, indem Type.GetType Aufruf () und suchen sie nach Name)

Ich sehe das Problem nicht mit Vererbung though.

Type type = typeof(YourStaticClass);

Attribute[] attributes = type.GetCustomAttributes(...);

Ein Elternteil weiß nicht, wie viele Childs hat. Aber ein Kind über seine Eltern kennen. Der einzige Weg, ein Elternteil über das Kind ist durch Polymorphismus wissen sollte, die keine Eigenschaft der statischen Mitglieder.

Was Sie versuchen zu tun ist, um das Kind Klasse in einer öffentlichen statischen Eigenschaft von Eltern zu kennen. Warum Sie nicht berücksichtigen Ihr Kind Klassenreferenz als Parameter in der statischen Methode in Ihrer Basisklasse zu senden und dann in der Basisklasse haben die Referenz des Kindes Klasse durch seine GetType-Methode aufrufen ...

public static string GetTableName(BaseClass childsObjectWrappedInBaseReference) {
   Type type = childsObjectWrappedInBaseReference.GetType();
   ....
   ....
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top