Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在程序启动时实例化一个随机类_C#_Oop_Inheritance_Console Application - Fatal编程技术网

C# 在程序启动时实例化一个随机类

C# 在程序启动时实例化一个随机类,c#,oop,inheritance,console-application,C#,Oop,Inheritance,Console Application,我现在只是在玩继承和其他一些概念 我创建了一个控制台应用程序,其中包含以下类: 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 当控制台应用程序

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

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

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
当控制台应用程序启动时,我想从人类、鱼类、哺乳动物、爬行动物、鸟类或两栖类创建一个新对象。将随机选择要实例化的这些类中的哪一个

一旦随机选择了一个类,我就使用console.writeline向用户询问一些关键问题,为给定的对象属性赋值

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

//使用当前正在运行的项目的DLL
// 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);
var runningAssembly=Assembly.getExecutionGassemby(); //所有类都有一个“类型”,它公开有关该类的信息 var OrganimType=类型(有机体); //跟踪我们发现的所有生物种类。 var allOrganismTypes=新列表(); //检查我们项目中的所有类型,找到继承我们项目的人 //生物类 foreach(runningAssembly.GetTypes()中的变量类型) { if(组织类型IsAssignableFrom(类型)) allOrganismTypes.Add(类型); } //在这里找到一个随机索引(自己做) var Therandominex=10; var selectedType=allOrganismTypes[theRandomIndex]; //activator是.NET中可以创建新对象的类 //借助打字机 var selected=(有机体)Activator.CreateInstance(selectedType);
代码中有一些“错误”,您必须自己更正。

//使用当前正在运行的项目的DLL
var runningAssembly=Assembly.getExecutionGassemby();
//所有类都有一个“类型”,它公开有关该类的信息
var OrganimType=类型(有机体);
//跟踪我们发现的所有生物种类。
var allOrganismTypes=新列表();
//检查我们项目中的所有类型,找到继承我们项目的人
//生物类
foreach(runningAssembly.GetTypes()中的变量类型)
{
if(组织类型IsAssignableFrom(类型))
allOrganismTypes.Add(类型);
}
//在这里找到一个随机索引(自己做)
var Therandominex=10;
var selectedType=allOrganismTypes[theRandomIndex];
//activator是.NET中可以创建新对象的类
//借助打字机
var selected=(有机体)Activator.CreateInstance(selectedType);

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

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

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(比我建议的代码简单),但是如果没有太多的类,使用更基本的代码将更具可读性,并且允许更大的灵活性(您不需要每种类型都有一个偶数)。

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

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(比我建议的代码简单),但是如果没有太多的类,那么使用更基本的代码将更具可读性,并允许更大的灵活性(您不需要每种类型都具有相同的概率)。

如果不使用反射,您可以通过一个类实例列表来实现:

     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)];
var classlist=newlist();
添加(newbird());
添加(新的哺乳动物());
添加(新爬虫类());
添加(newfish());
添加(新的两栖动物());
添加(newhuman());
var r=新的随机变量();
var实例=类列表[r.Next(0,5)];

不使用反射,您可以通过类实例列表来实现:

     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)];
var classlist=newlist();
添加(newbird());
添加(新的哺乳动物());
添加(新爬虫类());
添加(newfish());
添加(新的两栖动物());
添加(newhuman());
var r=新的随机变量();
var实例=类列表[r.Next(0,5)];

您的意思是按系统从上述类中随机创建对象吗..?您尝试了什么?你知道吗?你的意思是从上面提到的类中按系统随机创建一个对象吗?你尝试了什么?你知道吗?谢谢你。我使用了你的,因为它与我的代码耦合最少,让我可以选择添加更多物种,只需最少的修改。每个人都喜欢LINQ。。。而不是列表声明和foreach:
List allOrganismTypes=runningAssembly.GetTypes()。其中(t=>organismType.IsAssignableFrom(t)).ToList()嗯,您还必须过滤掉接口本身<代码>列出allOrganismTypes=runningAssembly.GetTypes()。其中(t=>!t.IsInterface()&&organismType.IsAssignableFrom(t)).ToList()谢谢jgauffin。我使用了你的,因为它与我的代码耦合最少,让我可以选择添加更多物种,只需最少的修改。每个人都喜欢LINQ。。。而不是列表声明和foreach:
List allOrganismTypes=runningAssembly.GetTypes()。其中(t=>organismType.IsAssignableFrom(t)).ToList()嗯,您还必须过滤掉接口本身<代码>列出allOrganismTypes=runningAssembly.GetTypes()。其中(t=>!t.IsInterface()&&organismType.IsAssignableFrom(t)).ToList()但现在您已经有了实例。如果您只想在需要时创建实例,而不创建所有其他实例,那么该怎么办?但现在您已经有了实例。如果只想在需要时创建实例,而不创建所有其他实例,该怎么办?