gpt4 book ai didi

c# - 如何将项目添加到 ISet

转载 作者:太空狗 更新时间:2023-10-29 22:53:50 25 4
gpt4 key购买 nike

我有三个类,分别是 BrokerInstrumentBrokerInstrument

using Iesi.Collections.Generic;

public class Broker : ActiveDefaultEntity
{
public virtual string Name { get; set; }
public virtual ISet<BrokerInstrument> BrokerInstruments { get; set; }
}

public class Instrument : Entity
{
public virtual string Name { get; set; }
public virtual string Symbol {get; set;}
public virtual ISet<BrokerInstrument> BrokerInstruments { get; set; }
public virtual bool IsActive { get; set; }
}

public class BrokerInstrument : Entity
{
public virtual Broker Broker { get; set; }
public virtual Instrument Instrument { get; set; }
public virtual decimal MinIncrement { get; set; }
}

如果我使用这些类创建三个新对象(每种类型一个),我该如何关联它们?例如:

Instrument instrument = new Instrument { 
Name = "Test Instrument",
Symbol = "Test",
IsActive = true
};
Broker broker = new Broker {
Name = "My Test Broker",
IsActive = true,
IsDefault = false
};
BrokerInstrument brokerInstrument = new BrokerInstrument {
Broker = broker,
Instrument = instrument,
MinIncrement = 0.01M
};

instrument 如何“知道”新的 brokerInstrument 现在与其相关联?如果我现在运行 if (instrument.Brokerinstruments == null),我会得到 true。我是否必须关联 BrokerInstrument 声明中的对象,然后返回并将其添加到 instrument.BrokerInstruments ISet

如果我尝试执行:instrument.BrokerInstruments.Add(instrument) 我会收到一个错误,因为它为空。使困惑。我错过了什么?模拟这种关系的最佳方式是什么?这些对象将使用 NHibernate 持久保存到数据库中。

最佳答案

您遇到异常是因为您没有初始化 Instrument 类的 BrokerInstruments 属性(意味着该属性的值为 null)。要解决这个问题,您需要 Instrument 上的构造函数:

public Instrument() {
BrokerInstruments = new HashSet<BrokerInstrument>();
}

现在,如果您想要添加一个 Instrument 的通知,那就是另一个问题了。最简单和最安全的方法是使 BrokerInstruments 属性 getter 返回一个 IEnumerable,删除 setter,并添加一个 AddBrokerInstrument 方法:

// With this, you don't need the constructor above.
private ISet<BrokerInstrument> _brokerInstruments = new HashSet<BrokerInstrument>();

public virtual IEnumerable<BrokerInstrument> BrokerInstruments {
get { return _brokerInstruments; }

// This setter should allow NHibernate to set the property while still hiding it from external callers
protected set { _brokerInstruments = new HashSet<BrokerInstrument>(value); }
}

public void AddBrokerInstrument(BrokerInstrument brokerInstrument) {
// Any other logic that needs to happen before an instrument is added
_brokerInstruments.Add(brokerInstrument);
// Any other logic that needs to happen after an instrument is added
}

我在上面使用了一个 IEnumerable,因为你想向这个函数的用户表明不允许他们直接将仪器添加到集合中——他们需要调用你的方法。

关于c# - 如何将项目添加到 ISet<T>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8883623/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com