【问题标题】:C# select Class during RuntimeC# 在运行时选择类
【发布时间】:2018-06-22 05:45:07
【问题描述】:

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

为此,我使用了一个抽象类,我们称之为“X”

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

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

例子:

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

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

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 个案例的 switch case。有更好的解决方案吗?

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

编辑:只有在编译期间自动添加所有现有对时,某些“键、值”对数组才是理想的。

【问题讨论】:

  • 欢迎来到 SO 社区!您是否考虑过使用反射并实例化类,按名称将其调用为字符串?
  • cos it's my first. 这不完全正确,是吗?您拥有 Peer Pressure 徽章,这意味着您已经删除了大量 DV 的帖子。阅读(并关注)How to Ask 并使用tour 来避免这种情况
  • @DiegoRafaelSouza 谢谢,应该可以。只需了解反射是如何工作的。
  • @Plutonix 确实,我曾经有一个问题写得不好。当我试图改写它时,我被告知要等待 7 天。到那时我自己解决了这个问题。说谎不是我的本意。对不起。

标签: c# class dynamic switch-statement runtime


【解决方案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】:

    尝试如下反射;

    X _problem = null;
    int someInput; //any valid input readin via Console
    
    try
    {
    
    _problem = Assembly.GetExecutingAssembly().CreateInstance($«X{someInput}») as X
    }
    catch{}
    _promblem?.someFunction();
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 反射已经提到了,你能添加 SampleCode 吗?
      猜你喜欢
      • 2019-04-18
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      • 2011-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多