【问题标题】:Replacement for static classes to pack methods and variables替换静态类以打包方法和变量
【发布时间】:2020-02-10 07:44:56
【问题描述】:

我正在创建一个包含许多“测试”的应用。每个测试都有一个名称、描述和一些要运行的代码。

我想在 ListBox 中显示一个测试名称列表 (ObservableCollection)。当用户点击一个测试时,描述应该出现在一个文本框中,当用户点击开始按钮时,相关的方法应该启动。

我决定将每个测试放在一个具有“名称”和“描述”属性以及“测试”方法的静态类中。但是列出类很难(尝试使用Assembly.GetTypes(),但有点难)。手动创建方法或类列表也不是一个好方法。我认为应该有更好的方法来实现我的目标。

有人有更好的主意吗?

【问题讨论】:

  • 这些测试类有什么共同点?您如何确定该类是测试类而不是其他类?
  • 你能用示例代码展示其中一些测试类吗?

标签: c#


【解决方案1】:

我还发布了我的代码示例:

List<Type> Types = Assembly.GetExecutingAssembly().GetTypes()
    .Where(t => t.Namespace == "Tester.Tests").ToList();
//Creates a list of all classes in "Tester.Tests" namespace

foreach (Type item in Types)
{
    TestsList.Add(Activator.CreateInstance(item));
}
//Creates an instance (object) of each class in Types

TestNames = new ObservableCollection<string>(); //Initialized before

//Note that all classes in "Tester.Test" implemented "ITest" interface
foreach (ITest item in TestsList)
{
    ُTestNames.Add(item.Name);
}

【讨论】:

    【解决方案2】:

    您为什么决定将这些类设为静态?你可以把这些当作普通的普通类。

    你可以有一个接口,比如 ITestable

    public interface ITestable
    {
        string Name {get;set;}
        string Description {get;set;}
        Task Test();
    }
    
    1. 现在您可以搜索使用反射实现接口的类。
    2. 您可以从类列表中过滤非抽象类
    3. 那么您仍然可以过滤并获取具有无参数构造函数的类

    现在使用反射,您可以实例化类来获取对象

    var testable = (ITestable) Activator.CreateInstance(filteredClassType);

    我希望这对你有帮助。如果不能随意澄清,我在我的项目中做了完全相同的事情。

    【讨论】:

    • 谢谢。我现在无法测试此解决方案。我稍后会对其进行测试,如果它有效,我会接受它作为解决方案。我决定使用静态类,以便能够在不创建它们的实例的情况下使用它们。
    • “我在我的项目中做了完全相同的事情。”你的项目是开源的吗?您能否发布一个代码示例或您的项目?我真的需要一个代码示例!我是 OOP 语言的新手。
    • Something: Test(); 应该是一个方法(在我的例子中是 string Test();)而不是一个任务。因为它应该返回一些值。
    • 那我建议Task。重新调整字符串会起作用,但可能会冻结 UI
    • 我稍后会使用任务。因为Test(); 在 MainWindow 类中调用了一个方法,这让事情变得有点复杂。代码示例呢?我真的很需要! :)
    猜你喜欢
    • 2019-06-27
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    • 2017-10-07
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多