1

我现在只是在玩继承和其他一些概念。

我创建了一个控制台应用程序,其中包含以下类:

Public abstract Organism

Public abstract Animal : Organism

Public Bird : Animal
Public Mammal : Animal
Public Reptile : Animal
Public Fish : Animal
Public Amphibian : Animal

Public Human : Organism

当控制台应用程序启动时,我想从 Human、Fish、Mammal、Reptile、Bird 或 Amphibian 类创建一个新对象。要实例化这些类中的哪一个是随机选择的。

一旦随机选择了一个类,我就使用了 console.writeline 来询问用户关键问题以将值分配给给定的对象属性。

如何从这些类之一创建随机对象?

4

3 回答 3

5
// use the DLL of the project which is currently running
var runningAssembly = Assembly.GetExecutingAssemby();

// all classes have a "Type" which exposes information about the class
var organismType = typeof(Organism);

// to keep track of all organism classes that we've found.
var allOrganismTypes = new List<Type>();

// go through all types in our project and locate those who inherit our 
// organism class
foreach (var type in runningAssembly.GetTypes())
{
    if (organismType.IsAssignableFrom(type))
        allOrganismTypes.Add(type);
}

// Find a random index here (do it yourself)
var theRandomIndex = 10;


var selectedType = allOrganismTypes[theRandomIndex];

// activator is a class in .NET which can create new objects 
// with the help of a type
var selected = (Organism)Activator.CreateInstance(selectedType);

代码中有一些“错误”,您必须自己纠正。

于 2013-08-26T06:29:53.980 回答
1

如果您需要从列表中选择类型,您可以:

Type[] animals = new Type[]{ typeof(Bird), typeof(Mammal), typeof(Reptile), typeof(Fish), typeof(Amphibian) };
Animal animal = animals[new Random().Next(animals.Length)].GetConstructor(new Type[]{}).Invoke(new object[]{}) as Animal;

但是,如果您重视代码中的简单性/可读性(并且应该),如果可能,以下内容会更好:

Animal animal = null;
switch (new Random().Next(5))
{
    case 0:
        animal = new Bird();
        break;
    case 1:
        animal = new Mammal();
...
}

编辑:我忘记了 Activator.CreateInstance (比我建议的代码更简单),但是如果没有很多类,使用更基本的代码将更具可读性,并且允许更大的灵活性(你不需要每个类型都有一个偶概率)。

于 2013-08-26T06:31:28.130 回答
0

在不使用反射的情况下,您可以通过类实例列表来实现它:

     var classlist = new List<Organism>();  
    classlist.Add(new Bird());
    classlist.Add(new Mammal());    
    classlist.Add(new Reptile());
    classlist.Add(new Fish());  
    classlist.Add(new Amphibian());
    classlist.Add(new Human());

    var r = new Random();

    var instance = classlist[r.Next(0,5)];
于 2013-08-26T06:31:50.960 回答