2016-06-11 12 views
0

私はC#とプログラミングの分野で非常に新しいです。私は書籍やYouTubeのビデオでいくつかのエクササイズを行っていて、これらのコンセプトの多くに頭を抱えています。オブジェクトクラスのプロパティであるコンストラクタへのパラメータの受け渡し

現在、私はこの問題についていません。私は委託ショップの小規模なアプリケーションを持っており、ハードコードされたサンプルデータを削除し、プログラムがテキストファイルからデータを読み取るようにしていました。ここで

は私のベンダークラスです:

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

    public string LastName { get; set; } 

    public Vendor(string firstName, string lastName) 
    { 

     FirstName = firstName; 
     LastName = lastName; 
    } 
} 

これは本質的にベンダーの私の.csvファイルを受け取り、文字列配列にそれらをプッシュし、オブジェクトを作成し、それが配列の値を持つプロパティです埋め、その後に項目を追加しますVendor型のリストこのメソッドはエラーをスローしません。

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); 
    } 
} 

私は、リストに項目を追加するためのこの同じソリューションをしようとすると、私は私のアイテムクラスに位置型ベンダーの財産である項目の「所有者」に合格したいと思います。私はコンストラクタでオブジェクトをパラメータとして渡す際に実用的な解決策を得ることができなかったので、私は正式なデータ型を渡すことに固執しました。私は基本的に、First Name & Last NameのVendorのプロパティを使用し、それらをItem Ownerの姓と名字として設定したいと考えています。

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); 
} 

文字列を配列にそれを作るが、私は、デバッガを実行して、私のstore.Itemsリストをチェックしたときに、すべてのプロパティの値がnullである所有者を除いて設定されています。 私は1つの解決策が何とかfName + lNameを1つの文字列に結びつけることができると知っていますが、私はItemコンストラクタがどのパラメータを受け入れるか設定する必要があるかを理解するのに苦労しています。私が試しても、Onerプロパティは値を受け取らず、残りのアプリケーションがクラッシュする原因になります。

私は数時間これで作業していましたが、実際の解決策、あるいはこのシナリオの回避策を思い付くことはできません。

ご協力いただきまして誠にありがとうございます。

ありがとうございます!

答えて

0

私はあなたのコードでもコンパイルと思いますが、何が欲しいのはこれではありません。

Owner = new Vendor(fName, lName); 

これは、本質的にVendorインスタンスを作成し、Owner変数に割り当てます。それ以外の場合はOwnerが初期化されず、nullになるため、例外が発生します。

の代わりに、この:Item.Ownerが実際に作成されていないため

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

これは魅力のように働いた、迅速な応答をありがとう!そして、はい、コードをコンパイルしなかったので、私は達成しようとしていたアイデアを示したかっただけです。再度、感謝します! –

0

あなたは例外を持っています。 それを修正:

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

:なぜあなたが書くのですか 'Item.Owner'? staticではないようです。ちょうどOwnerを使用してください。

+0

答えをありがとう、これは働いた!私はItem.Ownerを使ってファーストネームとラストネームのプロパティにアクセスしようとしていました。期待通りに動作していないことが分かったら、私は何を達成しようとしているのかを知る手がかりを残しました。ありがとう! –

+0

このコードはコンパイルされません – thumbmunkeys

+0

私はちょうどItem.Ownerの代わりにOwnerを使用しました。申し訳ありませんが、上記の私の投稿では言及しませんでした。すべてがコンパイルされ、期待通りに機能します。 –

0

Javaでは、あるクラスが別のクラスのメンバであれば、それをnewで初期化します。

だからあなたのコンストラクタでは、次の操作を行いたい:

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

これはうまくいきました。 –

関連する問題