【问题标题】:Assembly.GetTypes() also gets methods? [duplicate]Assembly.GetTypes() 也获取方法? [复制]
【发布时间】:2018-01-10 20:23:03
【问题描述】:

我正在尝试对数据访问层进行单元测试,其中每个实体都应实现包含 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 和 Delete 方法的每个实现编写的调试行:

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 =&gt; t.IsClass 不将它们过滤掉?我可以通过查看名称是否以&lt; 开头来过滤它们,但有没有更好的方法?

【问题讨论】:

  • 您看到的是编译器生成的闭包类型。
  • 好的,这个术语可以帮助我在谷歌上找到更好的东西,如果没有别的!用我的答案显示此链接:stackoverflow.com/questions/32697570/… 如果您想将其转换为答案,我可以相信您...谢谢@SLaks

标签: c# reflection


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 2013-03-13
    相关资源
    最近更新 更多