You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义AutoDataAttribute自动模拟:忽略递归结构语法及消除警告方案

问题1:在自定义AutoDataAttribute中配置忽略递归结构的正确语法

要让AutoFixture自动忽略递归结构,核心是在创建Fixture实例的工厂方法中替换它的递归行为:移除默认抛出异常的ThrowingRecursionBehavior,添加自动忽略递归节点的OmitOnRecursionBehavior。这种写法既符合AutoFixture的最新设计规范,也能避免过时API的警告。

问题2:解决CS0618警告的正确配置方案

你遇到的CS0618警告,是因为直接访问了已被标记为过时的AutoDataAttribute.Fixture属性——官方现在推荐在构造函数传入的工厂方法里完成所有Fixture自定义,以此实现延迟加载优化。只需要把原来修改Behaviors的代码移到创建Fixture的lambda表达式中即可,修改后的完整代码如下:

using System.Linq;
using AutoFixture;
using AutoFixture.AutoMoq;
using AutoFixture.Xunit2;

namespace Shared.TestResources.AutoFixture
{
    public class AutoMoqDataAttribute : AutoDataAttribute
    {
        public AutoMoqDataAttribute() 
            : base(() => 
            {
                var fixture = new Fixture().Customize(
                    new CompositeCustomization(
                        new AutoMoqCustomization(), 
                        new SupportMutableValueTypesCustomization()));
                
                // 在这里处理递归行为,替代原来访问this.Fixture的代码
                var throwingBehaviors = fixture.Behaviors.OfType<ThrowingRecursionBehavior>().ToList();
                foreach (var behavior in throwingBehaviors)
                {
                    fixture.Behaviors.Remove(behavior);
                }
                fixture.Behaviors.Add(new OmitOnRecursionBehavior());
                
                return fixture;
            })
        {
        }
    }
}

补充简化写法

如果你觉得移除行为的代码有点繁琐,还可以用更简洁的链式调用实现相同效果:

// 替换原来的移除循环代码
fixture.Behaviors.RemoveAll(b => b is ThrowingRecursionBehavior);
fixture.Behaviors.Add(new OmitOnRecursionBehavior());

这种修改方式完全遵循了AutoFixture的性能优化设计(延迟创建Fixture),彻底消除了过时API警告,不需要再用#pragma屏蔽。

内容的提问来源于stack exchange,提问作者Andr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:10:25