2017-09-05 15 views
0

Wie kann ich den Wert eines Objekts in einem Objekt-Array festlegen/erhalten?Zugriff auf Methoden der Unterklasse im Objekt-Array C#?

Derzeit erhalte ich: "Objekt keine Definition enthält für 'Wert' und keine Erweiterungsmethode"

Beispiel C#;

public class myObjClass 
    { 
     public int value = 5; 
    } 

    public class myObjClass2 
    { 
     public float[] pos = new float[2]; 
    } 

    public void test() 
    { 
     myObjClass myObj = new myObjClass(); 
     myObjClass2 myObj2 = new myObjClass2(); 

     object[] objArr = new object[2]; 
     objArr[0] = myObj; 
     objArr[1] = myObj2; 
     Debug.Print(myObj.value.ToString()); 
     Debug.Print(objArr[0].value.ToString()); // how? 

    } 
+0

** Objekt ** enthält keine Definition für 'Wert', ** myObjClass ** tut. Sie müssen casten. Oder mach es zu einem 'myObjClass [] objArr'. Klassennamen sollten übrigens mit einem Großbuchstaben beginnen. – Fildor

+1

Warum verwenden Sie Objekt-Array? –

+1

Verwenden Sie kein Objekt, das das Problem verursacht. Verwenden Sie einen echten Klassentyp. Verwenden Sie Folgendes: myObjClass [] objArr = new myObjClass [2]; – jdweng

Antwort

4

Sein, weil ein Generic object hat nicht die Eigenschaft value hat Ihre Klasse myObjClass. Um dies zu beheben Sie cast die Artikel Ihrer Klasse könnte etwa so:

((myObjClass)objArr[0]).value.ToString() 

Nur das tun ^, wenn Sie sicher von der Art sind


Stattdessen könnte man es auch überprüfen zuerst:

Mit as:

var item = objArr[0] as myObjClass; 
if(item != null) // Item will be null if its not a 'myObjClass' 
{ 
    //Do stuff with item 
} 

Oder mit is:

if(objArr[0] is myObjClass) 
{ 
    var item = (myObjClass)objArr[0]; 
    //Do stuff with item 
} 
1

Sie müssen Objekt bekannten Art werfen, die myObjClass ist, wie:

((myObjClass)objArr[0]).value.ToString(); 

Oder Sie verwenden reflection

var valueString = objArr[0].GetType().GetProperty("value").GetValue(objArr[0]); 
Debug.Print(valueString.ToString()); 

Hoffnung hilft,

2

Wenn ein Objekt Array müssen Sie in der realen Typ umgewandelt (hier: myObjClass), bevor die Felder zugreifen:

Sie können zugreifen das Objekt wie dieses

((myObjClass)objArr[0]).value 

aber Ich würde es nicht empfehlen. Können nicht Sie Ihren Array haben den konkreten Typen

var array = new myObjClass[42] 

eine kompakte sichere Alternative zu sein, den Wert abzurufen ist

(objArr[0] as myObjClass)?.value 
0

Sie ein einzelnes Objekt haben, dass in der Tat eine Instanz von myObjClass ist, und hat ein value Feld, aber Sie haben zwei Referenzen darauf.

Einer (myObj) ist dem Compiler vom Typ myObjClass bekannt, und es kann garantieren, dass es ein value Feld hat.

Der andere (objArr[0]) ist nur dem Compiler vom Typ object bekannt, und es kann nicht garantieren, dass es ein value Feld hat.

Zum Beispiel könnten Sie tun:

objArr[0] = (random.Next() > 0.5) : myObj ? myObj2 

wo wir werden zur Laufzeit entscheiden, basierend auf dem Wert eine Zufallszahl, die bei objArr[0] die Art des eigentlichen Objekts sein wird.

Also, wenn dies erlaubt war, wäre die Hälfte der Zeit objArr[0].value korrekt, und die Hälfte der Zeit wird es ein Fehler sein.

1

Technisch können Sie ihn als

Debug.Print((objArr[0] as myObjClass)?.value.ToString()); 

Wir versuchen objArr[0] als myObjClass Gießen und wenn value gelingen und biegen sie string. Wenn objArr[0] nicht myObjClass ist kehren wir null als String

jedoch ein viel besseren WegToString() in beiden Klassen von Interesse zu implementieren ist:

public class myObjClass 
{ 
    public int value = 5; 

    public override string ToString() { 
     // When debugging we want to know "value" 
     return value.ToString(); 
    } 
} 

public class myObjClass2 
{ 
    public float[] pos = new float[2]; 

    public override string ToString() { 
     // When debugging we want to know "pos[0]" and "pos[1]" values 
     return $"{pos[0]} : {pos[1]}"; 
    } 
} 

Und dann legte eine einfache

// Just print out debug info (we don't want to know the actual objArr[0] class) 
Debug.Print(objArr[0].ToString()); 
Verwandte Themen