在Func键C#中输入的意外更改

问题描述 投票:0回答:2

我不知道如何调试的问题,所以也许这是一个初学者commong错误?用我在哪里及选择上了IEnumerable IM已在DocumentPositionMetaDataItem-属性的属性“金额”。运行代码时,你可以看到下面它总是改变它的价值(金额),以任何“AmountToConvert”的。

public class OrderPositionItem : IDocumentPositionItem
{
    public int DocumentId { get; set; }
    public string PositionId { get; set; }
    public ArticleItem Article { get; set; }
    public CategoryItem Category { get; set; }
    public UnitItem Unit { get; set; }
    public ValueAddedTaxPositionItem ValueAddedTaxPosition { get; set; }
    public FinancialAccountingAccountItem FinancialAccountingAccount { get; set; }
    public CostCenterItem CostCenter { get; set; }
    public DocumentPositionMetaDataItem DocumentPositionMetaDataItem { get; set; }
    public decimal AmountBilled { get; set; }
    public bool IsAlreadyBilled { get; set; }
    public decimal AmountToConvert { get; set; }

这种情况正在改变的价值是在元数据属性。

      public int DocumentsDataNumber { get; set; }
    public string PositionID { get; set; }
    public decimal Amount { get; set; }
    public decimal PriceNoVat { get; set; }
    public decimal AddedVat { get; set; }
    public decimal Price { get; set; }
    public decimal Total { get; set; }


    public decimal TotalWithVat { get; set; }

“量”转变为无论在“OrderPositionItem”“金额转换”的值。我不知道为什么。

这是我的名单(可查询)orderPositions,所有属性的orderPositions“金额”改为任何“AmountToConvert”的。

 List<OrderPositionItem> orderPositions

这是我的代码,将其转换OrderPositions其中可转换为DeliveryNotePositions。

     // assign selected order position items to the delivery note
            // (orderPosition has prop AmountToConvert, only convert this much and only if > 0)
            deliveryNote.DocumentPositionItems = 
                orderPositions.Any() 
                    ? orderPositions
                    .Where(OrderPositionItem.IsConvertibleToDeliveryNotePositionItemFunc)
                    .Select(OrderPositionItem.ToDeliveryNotePositionItemFunc)
                    .ToList()
                    : null;

其中FUNC:IsConvertibleToDeliveryNotePositionItemFunc

   public static readonly Func<OrderPositionItem, bool> IsConvertibleToDeliveryNotePositionItemFunc =
        orderPosition => !orderPosition.IsAlreadyBilled &&
                         orderPosition.AmountToConvert > 0 &&
                         orderPosition.AmountToConvert <=
                         orderPosition.DocumentPositionMetaDataItem.Amount - orderPosition.AmountBilled;/* left over amount */

选择FUNC:

    public static readonly Func<OrderPositionItem, DeliveryNotePositionItem> ToDeliveryNotePositionItemFunc =
        orderPosition => (DeliveryNotePositionItem) orderPosition;

在选择函数功能的演员:

        public static explicit operator DeliveryNotePositionItem(OrderPositionItem orderPosition)
    {
        if (orderPosition == null) throw new ArgumentNullException(nameof(orderPosition));

        var deliveryNotePositionItem = new DeliveryNotePositionItem()
        {
            // meta data
            DocumentPositionMetaDataItem = orderPosition.DocumentPositionMetaDataItem,
            // article
            Article = orderPosition.Article,
            // category
            Category = orderPosition.Category,
            // unit
            Unit = orderPosition.Unit,
            // value added tax position
            ValueAddedTaxPosition = orderPosition.ValueAddedTaxPosition,
            // cost center
            CostCenter = orderPosition.CostCenter,
            // financial accounting account
            FinancialAccountingAccount = orderPosition.FinancialAccountingAccount,
        };

        // adjust amounts and totals to given order position
        deliveryNotePositionItem.DocumentPositionMetaDataItem.Total =
            deliveryNotePositionItem.DocumentPositionMetaDataItem.Total /
            deliveryNotePositionItem.DocumentPositionMetaDataItem.Amount * orderPosition.AmountToConvert;
        deliveryNotePositionItem.DocumentPositionMetaDataItem.TotalWithVat =
            deliveryNotePositionItem.DocumentPositionMetaDataItem.TotalWithVat /
            deliveryNotePositionItem.DocumentPositionMetaDataItem.Amount * orderPosition.AmountToConvert;
        deliveryNotePositionItem.DocumentPositionMetaDataItem.Amount = orderPosition.AmountToConvert;
        return deliveryNotePositionItem;

    }

运行提供的代码前值:

Property Amount & AmountToConvert before Handling

Amount after Handling, now is AmountToConvert before handling?

c# linq class casting func
2个回答
1
投票

这似乎是造成混乱的事情是该行创建新的DeliveryNotePositionItem时:

DocumentPositionMetaDataItem = orderPosition.DocumentPositionMetaDataItem

这是设置该属性是相同DocumentPositionMetaDataItem对象是你的orderPosition。它不会对你或任何其他创建副本。这意味着这两个对象现在共享相同的DocumentPositionMetaDataItem

这显然意味着,当你改变它这种改变体现在你正在寻找在这两个地方。你需要做的是建立在原有基础上一个新的DocumentPositionMetaDataItem莫名其妙的对象。


0
投票

对不起,你看这个行

deliveryNotePositionItem.DocumentPositionMetaDataItem.Amount = orderPosition.AmountToConvert;

一月底

DeliveryNotePositionItem(OrderPositionItem orderPosition)

?

© www.soinside.com 2019 - 2024. All rights reserved.