c# - FakeItEasy 伪造带有构造函数中参数的自定义属性的抽象类抛出 ArgumentException

标签 c# lambda custom-attributes fakeiteasy

我遇到以下异常:

System.ArgumentException: 'Only constant and single-dimensional array expressions are supported'

在尝试使用在构造函数中接受参数的附加属性来伪造一些抽象对象时。

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>>(...) )。

编辑:我打开了一个 issue在 CaSTLe.Core 仓库中。

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

相关文章:

c# - c# 中的自定义属性,用于比较 mvc 应用程序中的 2 个日期属性

c# - WPF Listview 数据绑定(bind)到通用列表,由 WCF 服务动态填充

c# - 系统配置 web.config 和 app.config

C# 写入 linq 查询中的文件

C#类型转换,如何避免报错?

c# - 设置 ASP.NET Button 属性客户端和读取属性值服务器端

用于生成共享相同闭包变量的匿名委托(delegate)的 C# 技术

c# - 如何使用 lambda/linq to objects 从集合中提取一些数据?

c# - 对 C# Nest 的简单匹配查询

.net - 是否可以编写破坏构建的自定义属性(如 System.ObsoleteAttribute)?