如何限制函数参数值?

问题描述 投票:0回答:1

我有一个函数,它有一个枚举值作为参数。在此特定函数中,我希望枚举值只能具有四个枚举值中的两个。我可以限制预期参数吗?

public enum DifferenceType
{
    Identical,
    Added,
    Changed,
    Removed
}

public void DoSomething(DifferenceType difference)
{
    if( difference == DifferenceType.Added)
    {
        // do something
    }
    else // Assert the value is DifferenceType.Removed
    {
        // do something else
    }
}

我可以期待像

bool
之类的
IsDifferenceTypeAdded
或类似的东西,但这感觉不干净,因为它并不意味着否则它只能是
DifferenceType
。还有其他我没有想到的方法吗?

枚举在我们程序的不同地方使用,我无法更改它。这不是一个大问题,但我很好奇是否有更好的方法。

c# enums parameter-passing
1个回答
0
投票

没有灵丹妙药可以解决这个问题。具体来说,在您描述的情况下(当然,在不进一步了解您的实际系统的情况下),我可能宁愿按照 fana 在评论中建议的方式进行操作,并且只需为每种支持的类型提供一个方法:

public void DoSomethingOnAdd() {/* implementation */}

public void DoSomethingOnRemove() {/* implementation */}

但更一般地说,假设您有一个包含 40 个成员而不是 4 个成员的枚举,并且您希望该方法能够处理其中的 10 个成员。
在这种情况下,我会考虑为此方法创建另一个枚举,并且 向您的主枚举添加一个扩展方法,以将其转换为新的枚举 - 像这样:

public enum SupportedType
{
    Unsupported, Added, Removed
}

static class DifferenceTypeExtensions
{
    public static SupportedType ToSupportedType(this DifferenceType dt)
        => dt switch
        {
            DifferenceType.Added => SupportedType.Added,
            DifferenceType.Removed => SupportedType.Removed,
            _ => SupportedType.Unsupported
        };
 }

然后在你的方法中只需使用

SupportedType
枚举:

public void DoSomething(SupportedType difference)
{
    if(difference == SupportedType.Added)
    {
        // do something
    }
     if(difference == SupportedType.Removed)
    {
        // do something else
    }
}

请注意,您可能想要删除

Unsupported
成员并将其替换为引发异常,但这实际上取决于您的实际用例。

如果您希望其他人使用不适当的值调用此方法,您可能不应该使用异常,而只是不执行任何操作 - 因为异常应该用于异常情况,但话又说回来,这确实取决于您的用例。

© www.soinside.com 2019 - 2024. All rights reserved.