从构造函数中采用方法参数

时间:2014-02-13 08:02:23

标签: c# generics methods parameters constructor

我有一些需要大量参数的类。我刚刚创建了一个带有两个参数的例子来证明我的问题。

public class Zoo
{
    public List<Animal> Animals { get; set; }

    public Zoo()
    {
        Animals = new List<Animal>();
    }

    // Pass all parameters
    public void AddAnimal(string name, int age)
    {
        Animals.Add(new Animal(name, age));
    }

    // -> pseudo code <- Create the parameter reference automated -> pseudo code <-
    public void AddAnimal(params ...)
    {
        Animals.Add(new Animal(...));
    }
}

public class Animal
{
    public string Name { get; set; }
    public int Age { get; set; }

    public Animal(string name, int age)
    {
        Name = name;
        Age = age;
    }
}

如果我想向Animal添加Zoo,我有2个选择。

  1. 将所有参数传递给AddAnimal方法
  2. Animal对象添加到List
  3. 正如我所说,我有很多参数和很多“动物”。

    是否可以引用Animal构造函数的参数而无需手动将它们添加到AddAnimal方法中? (参见:第一个代码块中的-> pseudo code <-

    但我想保留方法调用。

    Zoo zoo = new Zoo();
    zoo.AddAnimal("Tom", 8);
    

    提前致谢, 扬

    修改 出于某种原因,我想阻止使用以下方法之一:

    zoo.AddAnimal(new Animal("Ben", 9));
    zoo.AddAnimal(new Animal { "Ben", 9 }); // With empty constructor...
    

    所以,最后一个问题是:是否可以只使用 构造函数参数而不将 c&amp; p引入方法?

2 个答案:

答案 0 :(得分:5)

不,您无法自动代理所有单独的构造函数参数。但你可以把负担转移给来电者:

public void Add(Animal animal)
{
    if(animal == null) throw new ArgumentNullException("animal");
    Animals.Add(animal);
}
...
zoo.Add(new Animal("Fred", 27));

或者您可以根据“通过所有参数”示例手动复制/粘贴签名/构造函数调用。

答案 1 :(得分:1)

我认为基本的想法应该是这样的:

public class Animal
{
    public string Name { get; set; }
    public int Age { get; set; }

    public override string ToString()
    {
        return "[" + Name + ", " + Age + "]";
    }
}

public class Zoo
{
    public List<Animal> Animals { get; set; }

    public Zoo()
    {
        Animals = new List<Animal>();
    }

    // Pass all parameters
    public void AddAnimal(string name, int age)
    {
        Animal animal = new Animal
        {
            Name = name,
            Age = age
        };

        Animals.Add(animal);
    }

    // -> pseudo code <- Create the parameter reference automated -> pseudo code <-
    public void AddAnimal(params object[] animalProperties)
    {
        Animal animal = new Animal
        {
            Name = animalProperties[0] as string,
            Age = (animalProperties[1] as int?).Value
        };

        Animals.Add(animal);
    }
}

public class Example
{
    public void Run()
    {
        Zoo zoo = new Zoo();
        zoo.AddAnimal("Tom", 8);

        foreach (Animal a in zoo.Animals)
        {
            Console.WriteLine(a.ToString());
        }
    }
}

但你能做到这一点的最好方法是传递给你的方法通用对象而不是特定的类型,在我看来这不是一个好主意(除非你真的确定你之前已经检查过类型)

另一个建议:如果你有很多属性,就像你说的那样避免构造函数的实现。我认为更容易管理而不必处理它(特别是如果某些属性可以为null)。