我正在尝试对数据访问层进行单元测试,其中每个实体都应该实现包含Save()和Delete()方法的接口。我想循环遍历每个实体模型并执行各种测试,使用反射看起来很简单:
[TestMethod]
public void AllDalModelsImplementIMyDALObject()
{
Assembly dalAssm = typeof(MyDAL.DataModels.MyEntity1).Assembly;
foreach (Type t in dalAssm.GetTypes().Where(t => t.IsClass && t.Namespace == "MyDAL.DataModels").ToList())
{
// Do stuff here
TestContext.WriteLine(t.Name + " " + t.Namespace);
}
}
但是当我查看输出时,除了所有看起来像Types
"都是类"的东西之外,我还看到为我的Save的每个实现编写的调试行和删除方法:
TestContext Messages:
MyEntity1 MyDAL.DataModels
MyEntity2 MyDAL.DataModels
MyEntity3 MyDAL.DataModels
MyEntity4 MyDAL.DataModels
<Save>d__8 MyDAL.DataModels // what are these and how do I filter them out?
<Delete>d__9 MyDAL.DataModels
<Delete>d__8 MyDAL.DataModels
<Save>d__9 MyDAL.DataModels
<Save>d__8 MyDAL.DataModels
<Delete>d__9 MyDAL.DataModels
<Save>d__8 MyDAL.DataModels
<Delete>d__9 MyDAL.DataModels
所以我的问题是这些是什么?为什么GetTypes()会返回它们,为什么没有t => t.IsClass
将它们过滤掉?我可以通过查看名称是否以<
开头来过滤它们,但有更好的方法吗?
答案 0 :(得分:1)
这些是编译器生成的闭包类,它们来自迭代器,异步方法或lambdas。
您可以通过检查CompilerGeneratedAttribute
来过滤它们。