如何获取C#中首条TransactionTP的首个ItemUtility的item与utility值
问题分析与解决方案
嘿,这问题我熟!你之所以用transactions[a].itemsUtilities[b](猜你说的matrix应该是定义好的transactions集合吧?)访问出错,核心原因是**TransactionTP类里的itemsUtilities属性是protected修饰符**——这个修饰符的意思是,只有TransactionTP本身或者它的子类才能直接访问这个属性,外部代码根本碰不到它,自然会报错啦。
下面给你几种靠谱的解决办法,按需选就行:
方法1:修改属性访问修饰符(最简单直接)
如果不介意直接暴露内部列表,可以把itemsUtilities的修饰符改成public,这样外部就能直接访问了:
public class TransactionTP { // 把protected改成public public List<ItemUtility> itemsUtilities { get; set; } protected int transactionUtility { get; set; } public TransactionTP(List<ItemUtility> itemsUtilities, int transactionUtility) { this.itemsUtilities = itemsUtilities; this.transactionUtility = transactionUtility; } }
之后你就能用transactions[0].itemsUtilities[0].item和transactions[0].itemsUtilities[0].utility获取首条交易的首个ItemUtility的值了。
方法2:添加公共只读属性(更符合封装原则)
如果想保留封装性,不想让外部随便修改内部的列表,可以添加一个公共的只读属性来暴露它:
public class TransactionTP { protected List<ItemUtility> itemsUtilities { get; set; } protected int transactionUtility { get; set; } // 添加公共只读属性,只允许外部读取,不能修改 public IReadOnlyList<ItemUtility> ItemsUtilities => itemsUtilities.AsReadOnly(); public TransactionTP(List<ItemUtility> itemsUtilities, int transactionUtility) { this.itemsUtilities = itemsUtilities; this.transactionUtility = transactionUtility; } }
调用方式和上面类似,但外部只能读取列表元素,不能直接修改整个列表或者添加/删除元素:
// 获取首条交易的首个ItemUtility的item和utility var firstItem = transactions[0].ItemsUtilities[0].item; var firstUtility = transactions[0].ItemsUtilities[0].utility;
方法3:添加获取指定元素的方法(更灵活)
如果只需要获取特定位置的元素,也可以专门加一个方法来实现,这样能更精准地控制访问权限:
public class TransactionTP { protected List<ItemUtility> itemsUtilities { get; set; } protected int transactionUtility { get; set; } public TransactionTP(List<ItemUtility> itemsUtilities, int transactionUtility) { this.itemsUtilities = itemsUtilities; this.transactionUtility = transactionUtility; } // 添加方法返回指定索引的ItemUtility,还可以加索引越界判断 public ItemUtility GetItemUtilityAt(int index) { if (index < 0 || index >= itemsUtilities.Count) { throw new ArgumentOutOfRangeException(nameof(index), "索引超出范围"); } return itemsUtilities[index]; } }
调用的时候就用:
var firstItemUtility = transactions[0].GetItemUtilityAt(0); var firstItem = firstItemUtility.item; var firstUtility = firstItemUtility.utility;
另外提个小建议:C#里属性名一般用帕斯卡命名法(比如ItemsUtilities而不是itemsUtilities),这样代码风格更规范哦~
内容的提问来源于stack exchange,提问作者Reza Hatami
相关产品推荐
相关产品推荐

