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,以表示是否成功加载了测试方案。
-