【问题标题】:enum backward compatibility枚举向后兼容性
【发布时间】:2014-03-10 00:28:42
【问题描述】:

我有枚举 A,它在版本 2 枚举 B 和 C 中变成了两个枚举。 有一个函数 GetSpecificEnum() 为版本 1 返回枚举 A,并为版本 2 及更高版本返回枚举 B 和 C。函数本身进行一些计算并返回符合我的场景的枚举。

我的问题是正确定义这个可以返回两个版本的函数。 我总是可以创建两个函数并以某种方式将计算作为私有重构方法,但我试图避免这种情况。

有办法吗?

public ?? GetSpecificEnum()
{
if(version == 1)
{
//do some stuff
return A.SomeValue;
}
else
{
// do some stuff
return KeyValuePair<B, C>(B.SomeValue, C.SomeValue);
}
}

【问题讨论】:

  • 能否显示GetSpecificEnum()函数代码?
  • 如果此方法返回 int 会更容易。说到向后兼容性,方法现在返回什么?编辑:没关系只是重读。

标签: c# .net


【解决方案1】:

您可以使用系统类型Enum 作为GetSpecificEnum 的返回值。然后,您的代码必须检查返回的类型,并相应地处理它。

    public enum A
    {
        ONE,TWO
    };

    public enum B
    {
        THREE,
        FOUR
    };

    public Enum GetThing(int version)
    {
        return version == 1 ? (Enum)A.ONE : B.THREE;
    }

    public void DoThing()
    {
        Enum e = GetThing(1);
        if (e is A)
        {
            // handle A
            A _a = (A)e;
        }
        else
        {
            // handle B
        }
    }

【讨论】:

  • 我还推荐一个通用版本 public T GetThing&lt;T&gt;(int version) where T : struct 。只是为了保存结果的装箱/拆箱
  • @ShlomiBorovitz 我认为他的问题是调用函数不知道结果的预期枚举类型应该是什么。那么怎么设置T呢?
  • Mathew,当 DoThing() 为 void 时,我如何返回我需要的 Enum 类型?
  • 但他最终还是得施展。好吧,如果那是在其他地方 - 那么你是对的。
  • @eugeneK GetThing 或(在您的版本中)GetSpecificEnum 是返回枚举的那个
【解决方案2】:

如果您是 API/产品提供商,您可以这样做:

    public enum OldEnum
    {
        One,
        Two,
        Three
    }

    public enum NewPart1
    {
        One,
        Two
    }

    public enum NewPart2
    {
        Three
    }

[Obsolete("This method is intended to by used be previous versions")]
    public OldEnum GetEnum(someparameters here)
    {

        // Some processing here
        return OldEnum.One;
    }

    public NewPart1 GetEnum(someparameters here)
    {
        // Do something here
        return NewPart1.One;
    }

    public NewPart2 GetEnum(someparameters here)
    {
        // Do something here
        return NewPart2.Three;
    }

如果您的枚举是从旧枚举中拆分出来的,那么您实际上不需要更改代码。最后,我们正在处理整数。请注意,拆分枚举仍然保留与之前相同的整数值。然后,您可以只转换整数值并将其发送出去。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多