2011-07-15 6 views
1

シナリオ: ここでは、アイテムクラスの入力を受け入れるWebフォームがあります。リストの戻り値の型を持つ値を代入したいのですがどうすればいいですか。カスタムクラスをリストに変換する<>

item value = new item(), 
value.feature = serialtextbox.text; //error 

foreach (var item in value) //error 
{ 
item.SerialNo= serialtextbox.text; 
} 

項目と項目のフィーチャクラス

Class Item 
{ 
list<Itemfeature> features; 
} 

class ItemFeature 
    { 
    public int SerialNo 
    { 
     get { return serialno; } 
     set { serialno = value; } 
    } 

    public int Weight 
    { 
     get { return weight; } 
     set { weight = value; } 
    } 

}

Plzを

+1

少なくとも完全なコードスニペットを表示してください。これはどの言語ですか?最初の行にある '、'はどうでしょうか? –

+0

さて、あなたの最初の最後に、あなたのエラーを引き起こす原因は何かあります。 – MGZero

答えて

5

を私を助け注:ませ言語が指定されていないが、それは、C#のように見えています。私はこの答えにC#を仮定しています。

あなたがここでやろうとしていることは本当に明確ではありませんが、私はそれを撃つでしょう。まず、あなたが使っている実際のコードを投稿したいと思っています。このコードはコンパイルされず、構文エラーが読み込まれます。

は、まずは、あなたのオブジェクトを見てみましょう:

class Item 
{ 
    List<ItemFeature> features; 
} 

class ItemFeature 
{ 
    public int SerialNo 
    { 
    get { return serialno; } 
    set { serialno = value; } 
    } 

    public int Weight 
    { 
    get { return weight; } 
    set { weight = value; } 
    } 
} 

あなたはシリアル番号(整数)と重量(整数)で構成されてカスタムクラス、ItemFeatureを、持っています。次に、ItemFeatureのリストで構成される別のカスタムクラスItemがあります。

今度はをItemに追加しようとしているようですが、すべてをループして再度設定しますか?おそらくこのような何か、?:

Item value = new Item(); 
value.features.Add(new ItemFeature { SerialNo = int.Parse(serialtextbox.Text) }); 

foreach (var item in value.features) 
{ 
    item.SerialNo = int.Parse(serialtextbox.Text); 
} 

(このコードは、コードとしておそらくフリーハンドであるので、私はそれか何かをテストしていないことに注意してください。)私はここで変更した内容

次のようになります。

  1. ItemFeatureを値に直接設定するのではなく、SerialNoプロパティを設定します。オブジェクトのプロパティを掘り下げて、オブジェクト全体に設定するのではなく、そのプロパティに値を設定する必要があります。
  2. 入力(文字列)をプロパティの型(int)に変換します。
  3. Itemオブジェクト自体ではなく、リスト全体をループします。 Itemオブジェクトには、リストとしてプロパティーが含まれていますが、オブジェクト自体はリストではありません。親オブジェクトではなく、プロパティをループすることができます。 /ノートを依頼する

いくつかのこと:

    正確に何をしようとする
  1. ?あなたはオブジェクトのリストを持っていますが、あなたはオブジェクトのリストを設定しています。そして、それをループして再び設定します。どうして?
  2. より多くのaptクラス/プロパティ名が必要な場合があります。 「アイテム」のようなものは少し不明なことがあります。
  3. Itemクラスには、パブリック変数featuresがあります。これは一般的に眉をひそめます。プロパティを使う方が良いです。そうすれば、後ろにロジックを追加する必要がある場合は、オブジェクト自体の外部で互換性を失うことはありません。ItemFeatureクラスには、このようなプロパティがあります。あなたが望むのであれば、automatic propertiesを使ってさらに短くすることができます。
  4. 私のコードはserialtextbox.Textの値で入力チェックを行っていないことに注意してください。そのはず。私は理想的な条件で動作するようなものへの導入アプローチとして、よりシンプルな形で提示しました。しかし、次のようなものがよいでしょう:

var serialValue = 0; 

if (!int.TryParse(serialtextbox.Text, out serialValue)) 
{ 
    // Here you would probably present an error to the user stating that the form field failed validation. 
    // Maybe even throw an exception? Depends on how you handle errors. 
    // Mainly, exit the logic flow. 
    return; 
} 

var value = new Item(); 
value.features.Add(new ItemFeature { SerialNo = serialValue }); 

編集:私はちょうど.Add()に私の呼び出しは、実際に失敗することに気づきました。あなたはそれを使用しようとする前にリストを初期化したいでしょう。このような何かにItemクラスの変更を検討:

class Item 
{ 
    public List<ItemFeature> features { get; set; } 

    public Item() 
    { 
    features = new List<ItemFeature>(); 
    } 
} 

二つのものがここで変更:

  1. を前述のように、私は、プロパティにパブリックメンバを変換します。
  2. リストを使用できるように初期化するコンストラクタを追加しました。それ以外の場合は、参照型で、デフォルトはnullになります。そのため、メソッドを呼び出すオブジェクトがないため、.Add()またはその他のメソッドをリストに呼び出すとNullReferenceExceptionがスローされます。
+0

エラー値を生成します.features.Add(新しいItemFeature {SerialNo = serialValue});オブジェクト参照がオブジェクト インスタンスに設定されていません。私はリストのインスタンスを作成し、それにitemfeatureのインスタンスを追加し、最後にそれを割り当てて解決しました。 value.features =リストインスタンス – Salman

+0

問題が解決して、ありがとうございました:) – Salman

+0

@ user751959:正解、私の最後の編集を参照してください。新しいインスタンスを作成するよりも、インスタンスをクラスのコンストラクタに作成するだけで、自動的に生成されるようにすることができます。それ以外の場合は、そのクラスのインスタンスを使用するたびに手動でインスタンスを作成する必要があります。 – David

関連する問題