当前位置:  开发笔记 > 编程语言 > 正文

如何从所有枚举类型中排除某些枚举

如何解决《如何从所有枚举类型中排除某些枚举》经验,为你挑选了1个好方法。

我试图从某些枚举类型的值集中排除某些枚举值,例如Unknown和。Uninitialized

我可以看到它Enums是使用给定类型EnumGenerator的所有可能Enum值的集合以循环方式生成的Enum

基于该代码,我的第一个想法是构建一个ISpecimenBuilder检查Type.IsEnum并执行context.Resolve(request)直到直到Resolve返回不在排除列表中的值的对象。

问题是这给了我递归错误。在检查了源代码之后,我明白了原因-如果构建器处理了一个请求,然后Resolve再次用相同的请求调用另一个,您将陷入无限循环。

但是由于它EnumGenerator是不可扩展的,而且我无法弄清楚如何拦截构建链,因此我很困惑如何解决此问题。



1> Serhii Shush..:

您可以创建一个自定义的标本生成器,该标本生成器使用现有的标本生成器,EnumGenerator但跳过不需要的值。在本样本中,我specimen.ToString()故意使用该方法,以便不与任何特定enum类型链接:

public class ExcludeUnknownEnumGenerator : ISpecimenBuilder
{
    private readonly EnumGenerator _enumGenerator = new EnumGenerator();

    public object Create(object request, ISpecimenContext context)
    {
        var enumType = request as Type;
        if (enumType == null || !enumType.IsEnum)
        {
            return new NoSpecimen();
        }

        var namesEnumerator = Enum.GetNames(enumType).GetEnumerator();
        while (namesEnumerator.MoveNext())
        {
            var specimen = _enumGenerator.Create(request, context);
            if (specimen.ToString() != "Unknown" &&
                specimen.ToString() != "Uninitialized")
            {
                return specimen;
            }
        }

        throw new ObjectCreationException(
            "AutoFixture was unable to create a value for " +
            enumType.FullName +
            " since it is an enum containing either no values or " +
            "ignored values only ('Unknown' and 'Uninitialized'). " +
            "Please add at least one valid value to the enum.");
    }
}

public enum EnumWithUnknown
{
    Known,
    Unknown,
    Wellknown,
    Uninitialized
}

以下代码显示enum不带UnknownUninitialized状态的值:

var fixture = new Fixture();
fixture.Customizations.Insert(0, new ExcludeUnknownEnumGenerator());

Console.Out.WriteLine("result = {0}", fixture.Create());
Console.Out.WriteLine("result = {0}", fixture.Create());
Console.Out.WriteLine("result = {0}", fixture.Create());
Console.Out.WriteLine("result = {0}", fixture.Create());

*** ConsoleOutput ***

result = Known
result = Wellknown
result = Known
result = Wellknown

推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有