Assembly.GetTypes()也获取方法?

时间:2018-01-10 20:23:04

标签: c# reflection

我正在尝试对数据访问层进行单元测试,其中每个实体都应该实现包含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将它们过滤掉?我可以通过查看名称是否以<开头来过滤它们,但有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

这些是编译器生成的闭包类,它们来自迭代器,异步方法或lambdas。

您可以通过检查CompilerGeneratedAttribute来过滤它们。