MS Fakes 错误 CS0117:Stub[ClassName] 不包含 [delegate 属性 name] 的定义,即使元数据表明它存在

MS Fakes Error CS0117 : Stub[ClassName] does not contain a definition for [delegate property name] even though metadata says it's there

我遇到一个问题,即 MS Fakes 没有将几个委托属性添加到 fakes 程序集,即使它们出现在元数据中也是如此。

我有一个 class A 继承自抽象泛型 class B<T> 并实现接口 IA。除了 T 之外的所有内容都在同一个命名空间中定义,并且都在同一个程序集中。

B 有一个方法 (BMethod) 并且 IA 定义了一个在 A.[=41= 中实现的方法 (IAMethod) ]

在我的测试项目中,我为包含这些 classes/interfaces 的项目添加了一个伪造的程序集。我已经指定 fakes 程序集应该只为 class A 添加一个存根作为 StubA,默认情况下也会将接口 IA 作为 StubIA 存根。

创建 StubA 的实例时,我可以将函数定义分配给从 class B 创建的所有委托,但我无法引用委托 属性 名称对于 A 中定义的功能以及 IA 的合同要求的功能。 (例如,我可以引用和分配 StubA.BMethodArgType,但不能引用和分配 StubA.IAMethodArgType

当我在 VS2015 中导航到 StubA 的定义时,我可以看到 VS 告诉我缺少的属性实际上存在于元数据中。

...
public class StubA : A, IStub<A>, IStub, IStubObservable, IPartialStub
{
...
    //
    // Summary:
    //     Sets the stub of B`1.BMethod(ArgType arg)
    public FakesDelegates.Func<ArgType, ReturnType> BMethodArgType;
    //
    // Summary:
    //     Sets the stub of A.IAMethod(ArgType arg)
    public FakesDelegates.Func<ArgType, ReturnType> IAMethodArgType;
...
}
...

但是当我打开 FakesAssemblies/ProjectName.Fakes.xml 时,我没有看到为 StubA 定义的 IAMethodArgType 成员,但我确实看到 [=] 的成员32=] 在 StubIA 中定义,存根接口。此外,如果我将 Interfaces="false" 属性添加到 ProjectName.fakes 中的 Add 标记,ProjectName.Fakes.xml 文件将不再包含 IAMethodArgType.[= 的成员41=]

尽管如此,我仍收到错误 CS0117,无法构建我的测试项目。我已经尝试清除我的 FakesAssembly 文件夹并重建。我尝试删除所有伪造的程序集引用并将它们重新添加进去。我尝试制作 IAMethod 实现 virtual。似乎没有任何帮助。

任何人都可以告诉我可能发生了什么,或者我可以在哪里检查以了解为什么会发生这种情况?

好的,所以我将其发布在这里以防其他人遇到这种头痛,但问题似乎是 AIA 方法的实现确实需要virtual 用于存根以使用它们。当我最初制作它们 virtual 时,我看到的是元数据和实际构建之间的滞后,所以看起来它们仍然不在元数据中,即使它们实际上已经被构建过程拾取并且不再产生错误 CS0117