创建一个对象,其中类存储在变量中

时间:2021-05-10 11:58:32

标签: c# winforms

已编辑

这是我的 IAnimal 界面

interface IAnimal
{
    string getName();
    int getAge();
    bool getGender();
    void eat();
}

这是我的 IWalk 界面

interface IWalk
{
    void walk();
}

这是我的 IBird 界面

interface IBird : IAnimal, IWalk
{

}

这是我的 IFlightless_bird 界面

interface IFlightless_bird : IBird
{

}

这是我的 Iswim 界面

interface ISwim
{
    void swim();
}

这是我的 King_penguin 班

public sealed class King_penguin : IFlightless_bird, ISwim 
{
    private string name;
    private int age;
    private bool gender;

    public King_penguin(string name, int age, bool gender)
    {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    public string getName()
    {
        return this.name;
    }

    public int getAge()
    {
        return this.age;
    }

    public bool getGender()
    {
        return this.gender;
    }

    public void eat()
    {
        Debug.WriteLine("I ate!");
    }

    public void walk()
    {
        Debug.WriteLine("I walked!");
    }

    public void swim()
    {
        Debug.WriteLine("I swam!");

    }
}

我有一个下拉列表,其中填充了与我的所有动物类同名的字符串。 1

这是StartForm表单的代码

public partial class StartForm : Form
{
    public StartForm()
    {
        InitializeComponent();
    }

    private void btnCreateAnimal_Click(object sender, EventArgs e)
    {
        string selected = comboBoxAnimal.SelectedItem.ToString();
        Debug.WriteLine(selected);
        var createAnimal = new CreateAnimalForm(selected);
        createAnimal.Show(this);
    }
}

选择动物后,我想定义构造函数所需的参数。 2

这是CreateAnimalForm表单的代码

public partial class CreateAnimalForm : Form
{
    string animal;
    public CreateAnimalForm(string animal)
    {
        this.animal = animal;
        InitializeComponent();
    }

    private void btnCreateAnimal_Click(object sender, EventArgs e)
    {
        bool gender;
        string name = textBoxName.ToString();
        int age = int.Parse(textBoxAge.Text);
        if (radioButtonMale.Checked)
        {
            gender = true;
        }
        else
        {
            gender = false;
        }
        
        IAnimal AnyAnimal = new this.animal(name, age, gender);

    }
}

当我定义了参数后,我希望能够按下按钮并使用定义的参数和选定的动物创建一个对象

2 个答案:

答案 0 :(得分:1)

如果您在编译时了解所有动物,那么简单的 switch 就可以处理它。

private IAnimal CreateAnimal(string name, int age, bool gender)
{
    return name switch { 
        nameof(King_penguin) => new King_penguin(name, age, gender),
        _ => throw new NotSupportedException($"Unknown animal '{name}'")
    };
}

答案 1 :(得分:1)

我用 AnimalFactory 解决了我的问题

public class AnimalFactory
{
    List<Type> animals = new List<Type>();

    public AnimalFactory()
    {
        LoadAnimals();
    }

    public IAnimal CreateInstance(string animalType, string name, int age, bool gender)
    {
        #region Linq
        var animal = animals
            .FirstOrDefault(a => a.Name == animalType);
        return Activator.CreateInstance(animal, name, age , gender) as IAnimal;
        #endregion
    }

    private void LoadAnimals()
    {
        string @namespace = "Zoo.Animals";
        //Reflection
        animals = Assembly.GetExecutingAssembly().GetTypes()
            .Where(t => t.IsClass && t.Namespace == @namespace)
            .Where(t => t.IsClass && !t.IsInterface)
            .ToList();

    }
}

当我知道我选择了哪个动物时,我将所有动物加载到一个列表中,并将它们与从 StartForm 获得的动物进行比较,然后创建此类的实例

我替换了这个代码:

private void btnCreateAnimal_Click(object sender, EventArgs e)
{
    bool gender;
    string name = textBoxName.ToString();
    int age = int.Parse(textBoxAge.Text);
    if (radioButtonMale.Checked)
    {
        gender = true;
    }
    else
    {
        gender = false;
    }
    
    IAnimal AnyAnimal = new this.animal(name, age, gender);

}

与:

    private void btnCreateAnimal_Click(object sender, EventArgs e)
    {
        bool gender;
        string name = textBoxName.ToString();
        int age = int.Parse(textBoxAge.Text);
        if (radioButtonMale.Checked)
        {
            gender = true;
        }
        else
        {
            gender = false;
        }
        IAnimal animal = new AnimalFactory().CreateInstance(this.animal, name, age, gender);
    }