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