csharp
              
              
            
          
          public static class TestManager
{
    static string dllPath = "./TestServices.dll";
    static Dictionary<string, ITest> TestScheme = new Dictionary<string, ITest>();
    static public ITest CurrentTest = null;
    static public void Load()
    {
        if (!File.Exists(dllPath))
        {
            isEnable = false;
            return;
        }
        TestScheme.Clear();
        var dllAssembly = Assembly.LoadFrom(dllPath);
        var types = dllAssembly.GetTypes()
                               .Where(x => x.GetInterface("ITest") != null);
        foreach (Type type in types)
        {
            var attributes = type.GetCustomAttributes<TestAttribute>(false);
            if (attributes.Count() <= 0)
            {
                continue;
            }
            TestAttribute testAttr = attributes.ElementAt(0);
            if (testAttr.Tools.Contains(GCH.CurTool))
            {
                var instance = (ITest)Activator.CreateInstance(type);
                TestScheme.Add(type.Name, instance);
            }
        }
        if (TestScheme.Count > 0)
        {
            isEnable = true;
        }
    }
}代码结构分析:
- 
类定义和成员变量: - TestManager是一个静态类,包含了一些静态成员变量和静态方法。
- dllPath:存储了一个相对路径- "./TestServices.dll",表示要加载的 DLL 文件的位置。使用相对路径可能会导致在不同的工作目录下出现问题,因为相对路径是相对于程序的启动目录的。
- TestScheme:一个静态的- Dictionary<string, ITest>类型的字典,用于存储根据一定条件筛选出来的测试方案,其中键是类型的名称,值是实现了- ITest接口的对象实例。
- CurrentTest:一个静态的- ITest类型的对象,初始化为- null,从代码来看,它可能是用于存储当前正在使用的测试对象,但在提供的代码中未看到其使用或赋值逻辑,可能是代码不完整或者尚未实现相应功能。
- Load:一个静态方法,用于加载测试相关的内容。
 
- 
Load方法的详细分析:- 
文件存在性检查: csharpif (!File.Exists(dllPath)) { isEnable = false; return; }首先检查 dllPath指向的文件是否存在,如果不存在,将isEnable(未在代码中声明,会导致编译错误)设置为false并返回,结束方法执行。这里可能遗漏了isEnable的声明。
- 
清空字典: csharpTestScheme.Clear();清空 TestScheme字典,以确保在重新加载时不会残留之前的数据。
- 
程序集加载和类型筛选: csharpvar dllAssembly = Assembly.LoadFrom(dllPath); var types = dllAssembly.GetTypes().Where(x => x.GetInterface("ITest")!= null);- 使用 Assembly.LoadFrom从指定的 DLL 路径加载程序集。
- 通过 GetTypes获取程序集中的所有类型,并使用Where筛选出实现了ITest接口的类型。
 
- 使用 
- 
属性检查和实例创建: csharpforeach (Type type in types) { var attributes = type.GetCustomAttributes<TestAttribute>(false); if (attributes.Count() <= 0) { continue; } TestAttribute testAttr = attributes.ElementAt(0); if (testAttr.Tools.Contains(GCH.CurTool)) { var instance = (ITest)Activator.CreateInstance(type); TestScheme.Add(type.Name, instance); } }- 对于筛选出来的每个类型,使用 GetCustomAttributes<TestAttribute>(false)获取该类型的TestAttribute集合。
- 如果 TestAttribute集合的元素数量小于等于 0,使用continue跳过该类型。
- 取 TestAttribute集合的第一个元素(使用ElementAt(0),如果集合为空,会引发异常)。
- 检查 TestAttribute的Tools属性是否包含GCH.CurTool,如果包含,使用Activator.CreateInstance创建该类型的实例,并添加到TestScheme字典中,键为类型的名称。
 
- 对于筛选出来的每个类型,使用 
- 
启用状态设置: csharpif (TestScheme.Count > 0) { isEnable = true; }根据 TestScheme字典中的元素数量,将isEnable(未声明)设置为true或保持为false,以表示是否成功加载了测试方案。
 
-