将listview中的对象转换为另一个对象

时间:2012-07-29 21:18:25

标签: c# visual-studio-2010 casting listviewitem

我有AnimalModel程序,我被困住了。 该程序包含一个Abstract类Animal,其子类为Mammal,Insect,Bird,Reptile和Marine。在每个子类中还有两个子类动物。

例如,哺乳动物有狼和狗类。

我的问题是我创建了一种将动物项添加到数组的方法。

我正在尝试将包含例如狼或狗的listview中的对象转换为Mammal对象而没有成功。

我尝试过两种方式,但都没有。

private void AddAnimalItem() 
{
    string m_age = txtAge.Text;
    string m_Name = txtName.Text;

    CategoryType m_CategoryType = (CategoryType)(lstCtgr.SelectedIndex);
    Animals animal = null;

    switch(m_CategoryType)
    {
        case CategoryType.Mammal:

            // first attempt
            Mammal mammalspecies  = (Mammal)Enum.Parse(typeof(Mammal),
                                        lstAnml.SelectedItem.ToString());

            // second attempt
            Mammal mammalspecies = lstAnimal.SelectedItems.Cast<Mammal>();

            // Static method for creating an Mammal to an animal
            animal = Mammal.MammalFactory(mammalspecies);
            break;
    }

    /* ... */
 }

2 个答案:

答案 0 :(得分:0)

我会为这段代码提出很多建议,其中最重要的是:

  1. 使用lstCtgr不会将序数转换为另一种类型(枚举,我假设),我会清除一个列表项类,其中包含项目的文本表示(ToString),并且能够独立于该项目获取实际的CategoryType清单的顺序。
  2. 我会用lstAnimal做类似的事情。如果你需要获得有关除了序数之外所选内容的信息,我会创建一个可以添加到lstAnimal的类,为您提供该信息。与lstCtr非常相似,类型实现ToString并提供对Mammal对象的访问。
  3. 但是,我们非常不清楚您需要做什么,甚至是您尝试使用您发布的代码执行的操作。你们都选择了一种动物(lstCtgr)是一种真正的动物(lstAnml)是没有意义的。动物在lstAnml中的含义似乎完全独立于lstCtr。

答案 1 :(得分:0)

您真的应该为您的问题提供更多信息。由于您没有提供足够的信息,我需要做一些假设: -

  • Mammal是一个类,而不是枚举。 (因为枚举不能有子类或子枚举。)
  • CategoryType是一个枚举,而不是一个类,但其中一个值也称为 Mammal (即CategoryType.Mammal)。
  • lstAnml ListBox ,其值是字符串,它们是Mammal子类的完全限定类名称(例如"MyNamespace.Wolf" },"MyNamespace.Dog")。
  • MammalWolfDog类都有无参数构造函数。

如果我的上述假设有误,请用缺失的信息更新您的问题。

如果我的上述假设是正确的,那么用以下内容替换您的第一次/第二次尝试: -

Type mammaltype = Type.GetType(lstAnml.SelectedItem.ToString());
Mammal mammalspecies = (Mammal) Activator.CreateInstance(mammaltype);

然而,你最后一句话的逻辑似乎是错误的。 Mammal.MammalFactory()应该将 enum 作为参数,而不是类实例。但如果Mammal确实是一个枚举,那么就不能有子类...

所以假设Mammal确实是一个类,而不是一个枚举,那么你的最后一个陈述应该只是:

animal = mammalspecies;