Laden...

Abfragen, ob Klasse bestimmte Eigenschaft hat

Erstellt von tomtom62 vor 14 Jahren Letzter Beitrag vor 14 Jahren 2.828 Views
T
tomtom62 Themenstarter:in
219 Beiträge seit 2006
vor 14 Jahren
Abfragen, ob Klasse bestimmte Eigenschaft hat

Hallo,

wahrscheinlich ist die Lösung für mein Problem sehr einfach, aber -)

Nehmen wir an, ich habe eine Klasse "Firma". Diese kann u.a. bestimmte Eigenschaften wie istGroß, istBeinahePleite, hatMehralsTausendMitarbeiter
enthalten, muss aber nicht.

Ein Programm nutzt diese Klasse zum Erstellen eines Objekts "MeineFirma".

Wie kann ich jetzt abfragen, ob das Objekt die Eigenschaft istBeinahePleite hat und
welchen Wert diese hat ?

Vielen Dank

Thomas

2.891 Beiträge seit 2004
vor 14 Jahren

Hallo tomtom62,

also typischerweise haben Objekte ja einen Typ. Da kannst du mit dem is-Operator prüfen, ob ein Objekt von diesem Typ ist und wenn ja, kannst du casten.
Aber irgendwie habe ich nicht das Gefühl, dass du das wissen wolltest. Gehört ja zu den Grundlagen. Kannst du mal etwas ausführlicher werden?

Ansonsten gibt es ja auch noch Reflection, womit du die Struktur und den Zustand eines Objekts (unbekannten Typs) abfragen kannst.

Gruß,
dN!3L

D
78 Beiträge seit 2007
vor 14 Jahren

Du kannst über die Methode GetType den Typ deiner Instanz bekommen und dann per GetProperties() die Liste der verfügbaren Properties abfragen.

U
1.688 Beiträge seit 2007
vor 14 Jahren

Hallo,

vielleicht meinst Du ein "interface" - auch das kann man mit dem is-Operator testen.

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo tomtom62,

alles bisher gesagte, ist zwar nicht falsch, aber passt m.E. nicht als Antwort auf deine Frage.

meineFirma wäre ja einfach ein Objekt der Klasse Firma und hat daher natürlich automatisch alle Eigenschaften, die in der Klasse Firma definiert sind. Die Eigenschaften wären ja sinnvollerweise vom Typ bool. Also kannst du sie mit

if (meineFirma.istBeinahePleite) ...

Abfragen.

T
tomtom62 Themenstarter:in
219 Beiträge seit 2006
vor 14 Jahren

Hallo,

eigentlich haben alle eure Antworten mir sehr weitergeholfen. Ich habe mir jetzt folgendes, sicherlich noch nicht optimales Konstrukt erstellt:



Type t=typeof(Company); //Company ist die Klasse mit den verschiedenen Properties

Company firma=new Company;

foreach(PropertyInfo pi in t.GetProperties())
   {

    Console.WriteLine(pi.Name);
    
   if(pi.CanRead)
     {
      
      object test=pi.GetValue(firma,null);

      Console.WriteLine(test.toString());

     }

   }

Damit kann ich jetzt alle Properties mit den Werten dazu auslesen. Ich denke daraus lassen sich auch leicht Routinen entwickeln, die den Wert bzw. das Vorhandensein eines bestimmten Attributes auslesen.

Vielen Dank für Eure Hilfe

Thomas

5.942 Beiträge seit 2005
vor 14 Jahren

Hallo Thomas

Eine Klasse hat einen feststehenden Typ, den kennst du ja.
Deine erste Aussage dass eben diese Klasse Eigenschaften haben kann, oder nicht, ist falsch.

Vermutlich hast du damit gemein, das Unterklassen zusätzlichen Eigenschaften haben können und die Basisklassen diese nicht haben.
Wenn es dir um das geht - und das nehme ich schwer an - solltest du dich mal mit Polymorphie beschäftigen und hier im Forum mal nach Typkaskaden schauen und wieso man sie vermeiden sollte.

Dein Ansatz geht IMHO nochmal ein Schritt weiter in die falsche Richtung.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

T
tomtom62 Themenstarter:in
219 Beiträge seit 2006
vor 14 Jahren

Hallo Peter,

eventuell kann ich mich nicht präzise genug ausdrücken. Nimm einmal folgendes Szenario an:

Ein Programm verweist auf eine DLL (Assembly), die neben anderem eine Klasse Company enthält. Mir kommt es im ersten Schritt nur auf diese Klasse an.

Ich weiß nur, dass es diese Klasse in der DLL gibt, aber nicht, welche Eigenschaften dort alle drin sind. Diese DLL gibt es in verschiedenen Versionen.

Ich will jetzt z.B. wissen, ob es in dieser Klasse eine Eigenschaft "IstFastPleite" gibt oder nicht. Das wäre ein bool, da reicht das Vorhandensein.

Es kann aber auch z.B. eine Eigenschaft "Jahresumsatz" geben, da würde mich neben dem Vorhandensein auch der Wert interessieren. Diese Werte sind fix in der Dll(Assembly) voreingestellt, werden also nur abgefragt.

Die Dll kann also austauschbar sein, dass Programm dagegen ist das Gleiche bzw. beide Entwicklungen (dll und Programm) müssen nichts miteinander zu tun haben.

Da ich also nicht immer weiß ob eine bestimmte Eigenschaft vorhanden ist, weil sie eventuell erst in einer späteren Version der DLL dazukommt muss ich das Ganze "flexibel" abfragen können.

Macht es das jetzt klarer (wenigstens etwas ??) -)

Thomas

916 Beiträge seit 2008
vor 14 Jahren

Einfach mit Reflection nach schauen. Am besten sogar du benutz den Reflector, damit kannst du jede .NET Assembly anschauen und analysieren.

Again what learned...

5.942 Beiträge seit 2005
vor 14 Jahren

Hallo Thomas

Ja, dann gehts nur über Reflection.
Allerdings finde ich das Design merkwürdig und unsauber.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011