2016-04-15 11 views
1

クラスインスタンスの列挙型の値を、<string, myClass>の辞書に表示するかどうかに基づいて編集しようとしています。どのような私には理にかなっては、下記のコードスニペット行うことです。クラス内の列挙を編集する(メンバーはインスタンス参照でアクセスできません)

if (pumpDict.ContainsKey(ID)) 
       { 
        foreach(KeyValuePair<string, PumpItem> kvp in pumpDict) 
        { 
         if(kvp.Key == ID) 
         { 
          kvp.Value.state = kvp.Value.state.Available; //error here 
          kvp.Value.fuelPumped = fuelPumped; 
          kvp.Value.fuelCost = fuelCost; 
          break; 
         } 
        } 

       } 

       else 
       { 
        PumpItem pump = new PumpItem(); 
        pumpDict.Add(ID, pump); 
       } 

そして、私のPumpItemsクラスのようなものである:

namespace PoSClientWPF 
{ 
    public enum pumpState 
    { 
     Available, 
     customerWaiting, 
     Pumping, 
     customerPaying 
    }; 

    public enum fuelSelection 
    { 
     Petrol, 
     Diesel, 
     LPG, 
     Hydrogen, 
     None 

    }; 
    class PumpItem 
    { 
     public double fuelPumped; 
     public double fuelCost; 

     public fuelSelection selection; 
     public pumpState state;  

     public PumpItem()//intialize constructor 
     {     
      this.fuelPumped = 0; 
      this.fuelCost = 0; 
      this.selection = fuelSelection.None; 
      this.state = pumpState.Available; 

     } 

    } 
} 

私はコンストラクタで列挙値を持っていることを信じるように導かれた、彼らクラス本体で宣言された列挙型の新しいインスタンスで、上記のように設定する必要があります。

私がやろうとしていることは論理的であることを、私には思えるが、私は述べて逢引の右側のエラーを取得しています:

「PoSClientWPF.pumpState.Availableにアクセスすることができないメンバー"

私はいくつかのフォーラムの中でこのエラーを探しましたが、静的変数を間違って呼び出すというエラーが見つかるようです。誰かが解決策の方向に私を向けることができますか?

ありがとうございます。

+0

変更 'kvp.Value.state.Available使用することができます;' 'pumpState.Availableため;' –

+0

を'kvp.Value.state = pumpState.Available'? – Quantic

+0

本当に正しいですが、どうして私が間違った割り当てを自分で見つけられなかったのか分かりません。 – James

答えて

2

あなたは間違ってEnumメンバーにアクセスしている:

// this is incorrect 
kvp.Value.state = kvp.Value.state.Available; //error here 

// this is the correct way 
kvp.Value.state = PoSClientWPF.pumpState.Available; 
0

あなたは辞書を持って知っていますか?

PumpItem pumpItem = pumpDict[ID]; 
pumpItem.state = PoSClientWPF.pumpState.Available; 

または

PumpItem pumpItem; 
if (pumpDict.TryGetValue(ID, out pumpItem)) 
{ 
    pumpItem.state = PoSClientWPF.pumpState.Available; 
} 
else 
{ 
    pumpItem = new PumpItem(); 
    pumpDict.Add(ID, pumpItem); 
} 

はちょうどPumpItemにIDを追加し、一覧

PumpItem pumpItem = pumpList.FirstOrDefualt(x => x.ID == ID) 
if (pumpItem == null) 
    pumpList.Add(new PumpItem(ID)); 
else 
    pumpItem.state = PoSClientWPF.pumpState.Available; 

class PumpItem 
{ 
    public double fuelPumped = 0; 
    public double fuelCost = 0; 
    public fuelSelection selection = fuelSelection.None; 
    public pumpState state = pumpState.Available; 
    public Int32? ID = null; 

    public PumpItem()//intialize constructor 
    { } 
    public PumpItem(Int32? ID) 
    { 
     this.ID = ID; 
    } 
}