我試圖將記錄插入對象列表中,但是調用該方法時什麼也沒插入。我究竟做錯了什麼?

2020-02-18 c#

我正在嘗試使用一種方法將數據插入到列表中,但是調用該方法後,我嘗試插入的內容均未顯示。有人可以告訴我我在做什麼錯嗎?我正在打電話給InsertMedicationOrder。

    private List<Medication> Meds;

    private List<MedOrder> MedOrder_;

    public FakeMedicationAccessor()
    {  
        MedOrder_ = new List<MedOrder>() 
        { 
            new MedOrder(){}
        };
    }

    public int InsertMedicationOrder(int orderID, int employeeID, int itemID, string itemName, int quantity)
    {
        MedOrder_.Add(GetMedicationOrder(orderID, employeeID, itemID, itemName, quantity));

        return 0;
    }

    public MedOrder GetMedicationOrder(int orderID, int employeeID, int itemID,string itemName, int quantity)
    {
        return new MedOrder
        {
            outgoingOrderID = orderID,
            employeeID = employeeID,
            itemID = itemID,
            itemName = itemName,
            quantityOrdered = quantity,
            itemCategoryID = "Medication"
        };
    }

該方法傳遞到這裡-

public bool CreateMedicationOrder(int orderID, int employeeID, int itemID, string itemName, int quantity)
{
    bool result = false;
    try
    {
        result = (1 == _activityAccessor.InsertMedicationOrder(orderID, employeeID, itemID, itemName, quantity));
    }
    catch (System.ApplicationException ex)
    {
        throw new ApplicationException("Meds not ordered", ex);
    }
    return result;
}

叫這裡

public void OrderMedications() 
{
    _medicationManager = new MedicationManager();
    int orderID = 1;
    int employeeID = 66;
    int itemID = 1;
    string itemName = "Med_A";

    _medicationManager.CreateMedicationOrder(orderID, employeeID, itemID, itemName, Int32.Parse(Quantity_input.Text));
}

FakeMedicationAccessor的實例化

  private IMedicationAccessor _activityAccessor;


    public MedicationManager()
    {
        _activityAccessor = new FakeMedicationAccessor();

    }

    public MedicationManager(IMedicationAccessor MedicationManager)
    {
        _activityAccessor = MedicationManager;

    }

Answers

您從InsertMedicationOrder返回0 ,並將其與1進行比較

1 == _activityAccessor.InsertMedicationOrder(orderID, employeeID, itemID, itemName, quantity));

1 == 0將始終為false。

返回1或

var before = MedOrder_.Count
MedOrder_.Add(...);
return MedOrder_.Count - before;

檢查是否將元素添加到列表中。

編輯:

這是您的代碼中發生的事情

  • 每當您調用InsertMedication() ,都會將元素添加到您的 清單。這是事實。
  • 每當您調用CreateMedicationOrder() ,它將返回false,但是您的 名單增加了 。這是事實。
  • 您可以在_medicationManager.CreateMedicationOrder()行之後對其進行檢查,並且可以自己查看,例如:

    var currentSize = _medicationManager.MedOrder_.Count; 不會編譯,因為MedOrder_私有的 ,如果您不只是繼續調用OrderMedications() ,這是一個好習慣,因為:

  • 每當您調用OrderMedications() ,由於您,此列表就消失了 通過代碼告訴_medicationManager指向一個全新的對象:

    _medicationManager = new MedicationManager();

因此,假設您沒有做這個完全瘋狂的事情來調用OrderMedications() ,您的列表中確實有很多物品! (通過多次調用InsertMedication() )但是我看不到任何代碼,該代碼檢查該列表是否為空,或者是否檢查其中的元素,甚至不檢查代碼以檢查計數。因此,我建議您應該查看列表以查看其中包含的內容 。例如,使用foreach。在FakeMedicationAccessor類中創建一個新函數:

void ReadMedicationOrders()
{
    foreach(var item in MedOrder_)
        Console.WriteLine(item.itemName);  //if it is a console application
}

以防萬一

您只需要調用OrderMedications() (讓您從Main說),那麼您只需在其他類中初始化一次_medicationManager 。因此,將其寫到班級頂部:

MedicationManager _medicationManager = new MedicationManager();

並擺脫函數中的重新初始化。刪除我註釋掉的行:

public void OrderMedications() 
{
    //_medicationManager = new MedicationManager();
    int orderID = 1;
    int employeeID = 66;
    int itemID = 1;
    string itemName = "Med_A";

    _medicationManager.CreateMedicationOrder(orderID, employeeID, itemID, itemName, Int32.Parse(Quantity_input.Text));
}

您還可能需要更改MedOrder_ FakeMedicationAccessor類中內部或公開,或創建一個新的功能(內FakeMedicationAccessor),如:

void PrintMedicationOrders()
{
    //do your logic here similar to ReadMedicationOrders()
}

請嘗試使用MedicationManager類的單例實例。每次創建MedicationManager類的對象時,該類又將創建FakeMedicationAccessor類的新實例。

    public void OrderMedications() 
    {
        if(_medicationManager == null)
        {
            _medicationManager = new MedicationManager();
        }
        int orderID = 1;
        int employeeID = 66;
        int itemID = 1;
        string itemName = "Med_A";

        _medicationManager.CreateMedicationOrder(orderID, employeeID, itemID, itemName, Int32.Parse(Quantity_input.Text));
    }

在創建MedicationManager的新實例的任何地方進行null檢查

Related