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溢出问题,但我忘了上界是独占的。修正了我自己的答案。:)