我收到以下异常:


  System.ArgumentException:'仅支持常量和一维数组表达式'


在尝试伪造带有附加属性的抽象对象时,该对象在构造函数中带有参数。

var foo = A.Fake<SelfComplementaryCustomizableTupleConsumer>(
            opt => opt.WithAttributes(
                () => new RequiredVariableNameAttribute(requiredVariableName,requiredVariableType)
                )
            );


值得一提的是,如果我不带任何参数调用构造函数,那么一切都很好。更令我着迷的是,如果我用常量替换变量,也不会出现问题。

完整的代码:

string requiredVariableName = "abc";
Type requiredVariableType = typeof(string);


var foo = A.Fake<SelfComplementaryCustomizableTupleConsumer>(
          opt => opt.WithAttributes(
                () => new RequiredVariableNameAttribute(requiredVariableName,requiredVariableType)
                )
         );
var requiredVariables = foo.GetRequiredVariables();

Assert.IsTrue(requiredVariables.TryGetValue(requiredVariableName, out Type tmp));

最佳答案

这是由于how the attribute creation expression is analyzed。它不支持所有可能的表达式,因为它非常复杂。我想可以处理局部变量的情况,但是代码在Castle.Core(由FakeItEasy使用)中,所以不要指望很快修复。同时,如果可以,在表达式中使用常量。如果不是,另一种方法是手动构建表达式(使用Expression.Lambda<Func<Attribute>>(...))。

编辑:我在Castle.Core存储库中打开了issue

关于c# - FakeItEasy伪造带有自定义属性且构造函数中带有参数的抽象类将引发ArgumentException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54044725/

10-16 15:49