Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.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#_Class_Types_Derived - Fatal编程技术网

C# 如何定义一个;列表“;派生类的定义?

C# 如何定义一个;列表“;派生类的定义?,c#,class,types,derived,C#,Class,Types,Derived,我有一个基类和一些派生类 public class MyBase {...} public class MyClass1 : MyBase {...} public class MyClass2 : MyBase {...} 现在我想列出这些派生类(类!!不是类的实例!),然后我想随机创建其中一个派生类的实例 这是怎么工作的 这里是我想要的伪C:) List classList=newlist(){MyClass1,MyClass2,MyClass3,…} MyBase randomInsta

我有一个基类和一些派生类

public class MyBase {...}
public class MyClass1 : MyBase {...}
public class MyClass2 : MyBase {...}
现在我想列出这些派生类(类!!不是类的实例!),然后我想随机创建其中一个派生类的实例

这是怎么工作的

这里是我想要的伪C:)

List classList=newlist(){MyClass1,MyClass2,MyClass3,…}
MyBase randomInstance=new classList[random.Next(0,classList.Count-1)]();

(不幸的是,这个列表结构需要MyBase的实例,而不是类名)

如果您想“创建”一个随机实例:

var selection = random.Next(0,2)

switch (selection)
{
    case 1: return new MyBase();
    case 2: return new MyClass1();
    case 3: return new MyClass2();
}

为所有这些类定义一个公共的
接口
,这样您就可以从方法中返回一些东西,这可能会很有用。或者,您可以简单地返回
对象
动态

,如果您想“创建”一个随机实例:

var selection = random.Next(0,2)

switch (selection)
{
    case 1: return new MyBase();
    case 2: return new MyClass1();
    case 3: return new MyClass2();
}
为所有这些类定义一个公共的
接口
,这样您就可以从方法中返回一些东西,这可能会很有用。或者,您可以简单地返回一个
对象
或一个
动态

类似的内容(假设一个无参数构造函数,并且B和C是从a派生的):

List types=新列表{typeof(A)、typeof(B)、typeof(C)};
A实例=(A)Activator.CreateInstance(类型[r.Next(0,types.Count)];
类似于(假设一个无参数构造函数,并且B和C是从a派生的):

List types=新列表{typeof(A)、typeof(B)、typeof(C)};
A实例=(A)Activator.CreateInstance(类型[r.Next(0,types.Count)];

您可以从这样的类型创建

class MyBase
{
}

class MyClass1 : MyBase
{
}

class MyClass2 : MyBase
{
}
这用于创建对象

void Main()
{
    var typesToPickFrom = new List<Type>()
    {
        typeof(MyBase),
        typeof(MyClass1),
        typeof(MyClass2)
    };

    var rnd = new Random();
    Type typeToCreate = typesToPickFrom [rnd.Next(typesToPickFrom.Count)];
    object newObject = Activator.CreateInstance(typeToCreate);
}
void Main()
{
var typesToPickFrom=新列表()
{
类型(MyBase),
类型(MyClass1),
类型(MyClass2)
};
var rnd=新随机数();
typeToCreate=typesToPickFrom[rnd.Next(typesToPickFrom.Count)];
object newObject=Activator.CreateInstance(typeToCreate);
}

您可以根据需要进行强制转换。

您可以从以下类型创建

class MyBase
{
}

class MyClass1 : MyBase
{
}

class MyClass2 : MyBase
{
}
这用于创建对象

void Main()
{
    var typesToPickFrom = new List<Type>()
    {
        typeof(MyBase),
        typeof(MyClass1),
        typeof(MyClass2)
    };

    var rnd = new Random();
    Type typeToCreate = typesToPickFrom [rnd.Next(typesToPickFrom.Count)];
    object newObject = Activator.CreateInstance(typeToCreate);
}
void Main()
{
var typesToPickFrom=新列表()
{
类型(MyBase),
类型(MyClass1),
类型(MyClass2)
};
var rnd=新随机数();
typeToCreate=typesToPickFrom[rnd.Next(typesToPickFrom.Count)];
object newObject=Activator.CreateInstance(typeToCreate);
}

您可以根据需要强制转换。

返回类型可能是
MyBase
,因为所有类都是
MyBase
或从
MyBase
继承的。返回类型可能是
MyBase
,因为所有类都是
MyBase
或从
MyBase继承的。不要忘记使用这种方法,列表中的每个类型都必须具有语义相同的构造函数。默认的无参数构造函数就可以了,但只要每个类型都有一个具有相同签名的构造函数,就可以了。注意:这种方法的唯一真正好处是简洁。编译器不会阻止你攻击自己,因为这都是运行时类型信息。当你想处理不确定类型(泛型之外)时,你无论如何都会失去类型安全性。不要忘记,要使用这种方法,列表中的每个类型都必须有语义相同的构造函数。默认的无参数构造函数就可以了,但只要每个类型都有一个具有相同签名的构造函数,就可以了。注意:这种方法的唯一真正好处是简洁。编译器不会阻止你攻击自己,因为这都是运行时类型信息。当你想处理不确定类型(泛型之外)时,你无论如何都会失去类型安全性。我本来想说你的索引器中有一个off-by-1溢出问题,但我忘了上界是独占的。修正了我自己的答案。:)我想说你的索引器中有一个off-by-1溢出问题,但我忘了上界是独占的。修正了我自己的答案。:)