从集合中的项访问泛型集合的实例

时间:2015-02-19 00:22:35

标签: c# generics generic-collections

我有一个通用集合,它代表一个订单,每个订单项都是“Item”类对象。订单的总价值基于所有订单项的组合值。我目前有一种方法可以在检索到“TotalValue”属性时获取订单的总价值,但我发现这种方法有点不优雅,因为它感觉像是薛定谔的变量;它只会在观察时成为总值。

有什么方法可以让“Item”成员保持在“Quote”集合中,以便在“Item”对象去修改它自己的时候触发包含它的Quote类实例的“updateValue”方法成本价值? item类会自动修改自己的“TotalCost”,但我希望它能够启动链并同时修改订单的总成本/价值。

我试图将其削减以仅保留相关位。

namespace Arbitrary
{
    public class Order<T> : IEnumerable<T> where T : Item
    {
        private List<T> _lines = new List<T>();

        private decimal _totalValue;
        public decimal TotalValue
        {
            get { return updateValue(); }
        }

        private decimal updateValue()
        {
            _totalValue = 0;
            foreach(T Item in _lines)
            {
                _totalValue += Item.TotalCost;
            }
            return _totalValue;
        }
    }

    public class Item
    {
        private decimal _cost;
        private int _quantity;
        private decimal _totalCost;

        public decimal Cost
        {
            get { return _cost; }
            set 
            { 
                _cost = value;
                _totalCost = (_cost * _quantity);
            }
        }
        public int Quantity
        {
            get { return _quantity; }
            set 
            { 
                _quantity = value;
                _totalCost = (_cost * _quantity);
            }
        }
        public decimal TotalCost
        {
            get { return _totalCost; }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

更新:感谢来自Blorgbeard的提示。我切换了&#34; Item&#34;的构造函数。获取Quote集合的对象引用(因为它们在没有Quote集合的情况下永远不会存在)。我更改了&#34; updateValue&#34;内部的方法,以便Item类访问它,因为它们都在同一个程序集中。更新的更改通过&#34; // modified&#34;

进行了评论
namespace Arbitrary
{
    public class Order<T> : IEnumerable<T> where T : Item
    {
        private List<T> _lines = new List<T>();

        private decimal _totalValue;
        public decimal TotalValue
        {
            get { return updateValue(); }
        }

        internal decimal updateValue()    // modified
        {
            _totalValue = 0;
            foreach(T Item in _lines)
            {
                _totalValue += Item.TotalCost;
            }
            return _totalValue;
        }
    }

    public class Item
    {
        private decimal _cost;
        private int _quantity;
        private decimal _totalCost;

        private Quote<Item> q;    // modified
        public Item(Quote<Item> q)    // modified
        {
            this.q = q;    // modified
        }

        public decimal Cost
        {
            get { return _cost; }
            set 
            { 
                _cost = value;
                _totalCost = (_cost * _quantity);
                q.updateValue();    // modified
            }
        }
        public int Quantity
        {
            get { return _quantity; }
            set 
            { 
                _quantity = value;
                _totalCost = (_cost * _quantity);
                q.updateValue();    // modified
            }
        }
        public decimal TotalCost
        {
            get { return _totalCost; }
        }
    }
}