C# 采用构造函数中的方法参数

C# 采用构造函数中的方法参数,c#,generics,methods,parameters,constructor,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,

我有一些需要很多参数的类。我刚刚创建了一个带有两个参数的示例来演示我的问题

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;
    }
}
提前感谢,, 一月

编辑: 出于某种原因,我希望防止使用以下方法之一:

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

因此,最后一个问题是:是否可以只使用构造函数参数,而不将它们添加到方法中?

否,您不能自动代理所有单个构造函数参数。但你可以把负担转移到打电话的人身上:

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

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

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

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());
        }
    }
}
公共类动物
{
公共字符串名称{get;set;}
公共整数{get;set;}
公共重写字符串ToString()
{
返回“[”+姓名+”,“+年龄+”];
}
}
公立动物园
{
公共列表动物{get;set;}
公共动物园()
{
动物=新列表();
}
//传递所有参数
public void AddAnimal(字符串名,整数)
{
新动物
{
Name=Name,
年龄=年龄
};
动物。添加(动物);
}

//->伪代码伪代码没错,塔克斯。但是,我想防止在“动物园”之外创建对象-类。正如我所说,我有很多动物都有更多的参数。难道不可能只传递泛型参数吗?谢谢!@Jan no,它不是;此外,使用如图所示的结构,调用者已经可以绕过一切:
zoo.animals.Add(new Iguanodon());
(其中
Iguanodon:Animal
,显然)+1您无法获得所有参数的自动泛型代理和编译时类型检查…@AlexeiLevenkov您可以。但您不能。谢谢。这是可能的,但我需要一个类型安全解决方案。因为所有参数都是必需的。此外(此处称为)Zoo类只是用来保存数据的。它里面并没有任何逻辑。无论如何:谢谢你们的回答。你们的
param object[]
方法可能是自动代理参数(运行时类型检查和装箱交易)所能得到的一切。请阅读模式,因为它可能是你们想要实现的……或者可能是t4(用于代码生成的VS模板…)
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());
        }
    }
}