2016-06-11 6 views
0

Ich bin sehr neu in C# und das Reich der Programmierung. Ich habe einige Übungen in Büchern und YouTube-Videos durchgeführt, um mich mit vielen dieser Konzepte vertraut zu machen.Übergeben von Parametern an einen Konstruktor, die Eigenschaften einer Objektklasse sind

Momentan stecke ich in diesem Problem fest. Ich habe eine kleine Anwendung für einen Konsignationsladen, und ich arbeitete daran, die fest codierten Beispieldaten zu entfernen und das Programm Daten aus Textdateien lesen zu lassen.

Hier ist meine Herstellerklasse:

public class Vendor 
{ 
    public string FirstName { get; set; } 

    public string LastName { get; set; } 

    public Vendor(string firstName, string lastName) 
    { 

     FirstName = firstName; 
     LastName = lastName; 
    } 
} 

Dies resultiert im Wesentlichen meiner CSV-Datei von Vendors nimmt und sie in eine String-Array schiebt, erstellt das Objekt und füllt es Eigenschaften mit Array-Werten ist, dann das Element ergänzt eine Liste vom Typ Lieferant. Diese Methode löst keine Fehler aus.

private void ReadFromFile() 
{ 
    string line = "";     
    while ((line = myReader1.ReadLine()) != null) 
    { 
     string[] data = line.Split(',');      
     Vendor v = new Vendor(data[0], data[1]); 
     store.Vendors.Add(v); 
    } 
} 

Wenn ich diese gleiche Lösung versuchen, für Artikel zu einer Liste hinzugefügt, ich möchte in den „Besitzer“ passieren des Elements, die eine Eigenschaft des Typs Vendor ist, in meinem Artikel Klasse befindet. Da ich keine funktionierende Lösung für die Übergabe eines Objekts als Parameter im Konstruktor erhalten konnte, entschied ich mich, bei der Übergabe formaler Datentypen zu bleiben. Ich möchte im Grunde die Eigenschaften des Verkäufers von Vorname & Nachname verwenden und diese als den Vor- und Nachnamen des Elementbesitzers festlegen.

public class Item 
{ 
    public string Title { get; set; }   

    public decimal Price { get; set; }    

    public Vendor Owner { get; set; } 

    public Item(string title, decimal price, string fName, string lName) 
    { 
     Title = title;    
     Price = price; 
     Item.Owner.FirstName = fName; // this is what I want to do 
     Item.Owner.LastName = lName; // throws objref error 
    } 
} 

//Input file format: title,price,fname,lname 
while ((line = myReader2.ReadLine()) != null) 
{ 
    string[] data2 = line.Split(','); 
    decimal price = decimal.Parse(data2[1]);        
    Item i = new Item(data2[0],price,data2[2],data2[3]);     
    store.Items.Add(i); 
} 

Die Saiten machen es in das Array, aber wenn ich den Debugger ausführen und überprüfen Sie meine store.Items Liste wird jede Eigenschaft Wert mit Ausnahme von Besitzern, die null ist. Ich weiß, eine Lösung könnte sein, irgendwie fName + lName in eine Zeichenfolge zu kombinieren, aber es fällt mir schwer zu verstehen, wie mein Item-Konstruktor in Bezug auf die Parameter eingerichtet werden muss, die er akzeptiert. Egal, was ich versuche, die Oner-Eigenschaft erhält nie einen Wert, der den Rest meiner Anwendung zum Absturz bringt.

Ich habe für ein paar Stunden daran gearbeitet, aber ich kann nicht scheinen, eine funktionierende Lösung oder sogar einen Workaround zu diesem Szenario zu finden.

Jede Hilfe wird sehr geschätzt.

Danke!

Antwort

0

Ich glaube nicht, Ihren Code selbst kompiliert, aber was Sie wollen, ist dies:

Owner = new Vendor(fName, lName); 

Dies schafft im Wesentlichen eine Vendor Instanz und weist ihn der Owner Variable. Owner ist ansonsten nicht initialisiert und null, deshalb erhalten Sie die Ausnahme.

statt dessen:

Item.Owner.FirstName = fName; // this is what I want to do 
Item.Owner.LastName = lName; // throws objref error 
+1

Dieser arbeitete wie ein Charme, vielen Dank für die schnelle Antwort! Und ja, in dem Code, den ich gepostet habe, habe ich es nicht kompiliert, ich wollte nur die Idee von dem zeigen, was ich erreichen wollte. Danke noch einmal! –

0

Sie haben Ausnahme, weil Item.Owner ist eigentlich nicht erstellt. Fix it:

public Item(string title, decimal price, string fName, string lName) 
{ 
    Title = title;    
    Price = price; 
    Item.Owner = new Vendor(fName, lName); 
} 

auch: Warum schreiben Sie 'Item.Owner'? Es scheint nicht static zu sein. Verwenden Sie nur .

+0

Danke für die Antwort, das hat funktioniert! Ich habe versucht, Item.Owner zu verwenden, um auf die Eigenschaften Vorname und Nachname zuzugreifen. Als ich merkte, dass das nicht wie erwartet funktionierte, überließ ich es, um einen Hinweis darauf zu geben, was ich erreichen wollte. Vielen Dank! –

+0

dieser Code wird nicht kompiliert – thumbmunkeys

+0

Ich habe nur Besitzer anstelle von Item.Owner, tut mir leid, ich habe nicht erwähnt, dass in meinem Beitrag oben. Alles kompiliert und funktioniert wie erwartet. –

0

Wenn eine Klasse in Java Mitglied einer anderen Klasse ist, initialisieren Sie sie mit new.

in Ihrem Konstruktor Also, Sie folgendes tun würde:

public Item(string title, decimal price, string fName, string lName) 
    { 
     Title = title;    
     Price = price; 
     Owner = new Vendor(fName, lName); 
+0

Danke für die Antwort das hat funktioniert. –

Verwandte Themen