不能对具有NullableContextAttribute

问题描述

我正在使用第三方库,该库具有一些我要使用Rhino Mocks模拟的类。当我尝试为一个类创建存根时,出现以下错误。我找不到对NullableContextAttribute的引用,但我认为它与在某个地方的事件/委托定义中指定可空类型有关。我不知道什么是IAttributedissassembler。

我已经阅读了一些有关使用AttributesToAvoidReplicating解决方案,但是我不确定该给哪个类。 NullableContextAttribute不是可以解析为我可以找到的任何名称间的类。

我正在使用C#、. NET Framework 4.7.2。我尝试将C#语言级别更改为更高,但是我认为可为空的引用属性位于c#8中的某个对象上,我认为我无法将其与任何.NET Framework一起使用?

        var myStub = MockRepository.GenerateStub<SomeOtherClass>();


   Castle.DynamicProxy.proxygenerationException : There was an error trying to replicate non-inheritable attribute NullableContextAttribute using default attribute disassembler. Use custom implementation of IAttributedisassembler (passed as 'Attributedisassembler' property of proxygenerationoptions) to replicate this attribute.
   at Castle.DynamicProxy.DefaultAttributedisassembler.disassemble(Attribute attribute)
   at Castle.DynamicProxy.Generators.Emitters.AbstractTypeEmitter.DefineCustomAttribute(Attribute attribute,IAttributedisassembler disassembler)
   at Castle.DynamicProxy.Generators.Baseproxygenerator.ReplicateNonInheritableAttributes(Type targettype,ClassEmitter emitter)
   at Castle.DynamicProxy.Generators.Classproxygenerator.GenerateType(String newName,Type[] interfaces)
   at Castle.DynamicProxy.Generators.Classproxygenerator.GenerateCode(Type[] interfaces,proxygenerationoptions options)
   at Castle.DynamicProxy.DefaultProxyBuilder.CreateClassproxy(Type classtoProxy,Type[] additionalInterfacesToProxy,proxygenerationoptions options)
   at Castle.DynamicProxy.proxygenerator.CreateClassproxyType(Type classtoProxy,proxygenerationoptions options)
   at Castle.DynamicProxy.proxygenerator.CreateClassproxy(Type classtoProxy,proxygenerationoptions options,Object[] constructorarguments,IInterceptor[] interceptors)
   at Rhino.Mocks.MockRepository.MockClass(CreateMockState mockStateFactory,Type type,Type[] extras,Object[] argumentsForConstructor)
   at Rhino.Mocks.MockRepository.Stub(Type type,Object[] argumentsForConstructor)
   at Rhino.Mocks.MockRepository.<>c__displayClass1`1.<GenerateStub>b__0(MockRepository repo)
   at Rhino.Mocks.MockRepository.CreateMockInReplay[T](Func`2 createMock)
   at 

解决方法

这是我肮脏的解决方法。由于NullableContextAttribute仅用于编译器,因此不能在源代码1中使用它。但是您可以在Array.Find(typeof(SomeOtherClass).Assembly.GetTypes(),t => t.Name == "NullableContextAttribute")这样的模拟程序集中找到这种类型,其中SomeOtherClass是您要模拟的东西。找到Type个对象,您可以将其传递给Castle.DynamicProxy.Generators.AttributesToAvoidReplicating.Add

我重复一遍,这可能是最糟糕的解决方案,但这对我有用。