因此,对于学校作业,我必须制作一个动物收容所,
有两个对象:Cats和Dogs,对象的每个新实例都会添加到对象列表中,如下所示:
public Cat Cat { get; private set; }
public Dog Dog { get; private set; }
public List<Dog> Dogs = new List<Dog>();
public List<Cat> Cats = new List<Cat>();
public void NewCat(string name, Gender gender, string badHabits)
{
this.Cat = new Cat(name, gender, badHabits);
Cats.Add(this.Cat);
}
public void NewDog(string name, Gender gender)
{
this.Dog = new Dog(name, gender);
Dogs.Add(this.Dog);
}
使用更新方法将两个列表添加到列表框中,如下所示:
private void Update()
{
lbAnimals.Items.Clear();
lbAnimals.Items.Clear();
foreach (Cat c in reservations.Cats)
{
lbAnimals.Items.Add(c.ToString());
}
foreach (Dog d in reservations.Dogs)
{
lbAnimals.Items.Add(d.ToString());
}
}
最后我需要将列表框中的选定对象转换为Dog对象或cat对象,这就是为狗做的:
private void btnReserveDog_Click(object sender, EventArgs e)
{
if (this.reservations.Dog != null)
{
var d= lbAnimals.SelectedItem as Dog;
d.Reserve(txtReservor.Text);
this.btnReserveDog.Enabled = false;
Update();
}
}
无论我似乎尝试什么,当我投射对象时,它返回一个空引用,我不知道为什么,任何帮助将不胜感激!
答案 0 :(得分:1)
ListBox
的项集合将接受任何类型的对象。您目前正在将对象从Cat
和Dog
转换为string
,然后再添加,当然当您使用as
并尝试将string
强制转换为Dog
,它失败了。 Dog
不是string
,这意味着您获得了null
(这是投标失败时as
所做的事情。)
您需要做的就是删除.ToString
()。即:
private void Update()
{
lbAnimals.Items.Clear();
lbAnimals.Items.Clear();
foreach (Cat c in reservations.Cats)
{
lbAnimals.Items.Add(c);
}
foreach (Dog d in reservations.Dogs)
{
lbAnimals.Items.Add(d);
}
}
然后,当您处理集合中的Dog
元素时,在使用Dog
时,您将获得as
个实例。
当然,对于Cat
元素,结果将为null
。您仍然需要确保处理null
值(通过在Dog
时不尝试转换为Cat
,反之亦然,或者检查{ {1}}结果)。
答案 1 :(得分:0)
在列表框中显示对象的最佳方法是不转换为字符串并返回,而是因为对象具有字符串属性,所以这应该显示在列表框中。因此,请尝试使用列表框的DisplayMember属性。所以试试这个
LbAnimals.DisplayMember = "name"; // this sets tge property of the object that would be displayed to name.
private void Update()
{
lbAnimals.Items.Clear();
lbAnimals.Items.Clear();
foreach (Cat c in reservations.Cats)
{
lbAnimals.Items.Add(c);
}
foreach (Dog d in reservations.Dogs)
{
lbAnimals.Items.Add(d);
}
}
private void btnReserveDog_Click(object sender, EventArgs e)
{
if (this.reservations.Dog != null)
{
//you also missed a null check here, this might raise an exception if no item is selected in the listbox
If ( lbAnimals.SelectedItem !=null)
{
Dog d= lbAnimals.SelectedItem as Dog;
d.Reserve(txtReservor.Text);
this.btnReserveDog.Enabled = false;
Update();
}
}
}
另一个问题是你要在同一个列表框中添加Dog和Cat对象,所以当你查找一只猫并尝试将它投射到狗时,你也会得到一个空引用异常。所以你可能想在转换之前使用GetType()方法检查类型。