C#在运行时选择Class

时间:2018-01-12 18:01:26

标签: c# class dynamic switch-statement runtime

如果你知道的话,我有一个ProjectEuler的C#项目。

为此,我使用抽象类来调用它' X'

public abstract class X {
protected abstract void SomeFunction()
}

该项目有600多个问题需要解决。对于每个问题,我创建一个继承自X的类。该类的名称始终是' Baseclassname'后跟一个数字

Exampel:

public class X2 : X {
public override void SomeFunction()
}

在运行时,我通过输入有效整数来选择控制台输入问题。这个整数进入一个开关并产生相应的问题并执行someFunction,如果' _problem'是不等于null。

X _problem = null;
int someInput; //any valid input readin via Console
switch(someInput)
{
case 1:
_problem = new X1();
break;
case 2:
_problem = new X2();
break;
.
.
.
case 610:
_problem = new X610();
break;
}
_promblem?.someFunction();

所以我向社区提出的问题是如何避免600多个案例的转换案例。有没有更好的解决方案呢?

我希望这个问题写得好,因为它是我的第一个问题。 :)

修改:某些键,值'如果在编译期间自动添加所有现有对,则对数组将是理想的。

3 个答案:

答案 0 :(得分:1)

尝试反思如下;

X _problem = null;
int someInput; //any valid input readin via Console

try
{

_problem = Assembly.GetExecutingAssembly().CreateInstance($«X{someInput}») as X
}
catch{}
_promblem?.someFunction();

答案 1 :(得分:1)

以下是您可以使用用户选择菜单执行的操作的框架:

//Get all the types that inherit from 'X'
var types = Assembly.GetExecutingAssembly().GetTypes()
    .Where(t => t.IsClass && !t.IsAbstract && t.IsSubclassOf(typeof(X)))
    .ToList();

Console.WriteLine("Choose a class to run");
var index = 0;
foreach (var type in types)
{
    Console.WriteLine($"{index++}: {type.Name}");
}

Console.Write("Enter number: ");

//Much better to use "TryParse" here and validate the input
index = int.Parse(Console.ReadLine());

var instance = (X)Activator.CreateInstance(types[index]);

instance.SomeFunction();

注意,您必须将保护级别更改为public才能使其正常工作。

答案 2 :(得分:-1)

如果名称格式正确(即可以从输入生成类名),则可以很容易地使用System.Reflection.Assembly的CreateInstance方法,然后转换为抽象类型并使用基本成员。