我有一个函数,它有一个枚举值作为参数。在此特定函数中,我希望枚举值只能具有四个枚举值中的两个。我可以限制预期参数吗?
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
。还有其他我没有想到的方法吗?
枚举在我们程序的不同地方使用,我无法更改它。这不是一个大问题,但我很好奇是否有更好的方法。
没有灵丹妙药可以解决这个问题。具体来说,在您描述的情况下(当然,在不进一步了解您的实际系统的情况下),我可能宁愿按照 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
成员并将其替换为引发异常,但这实际上取决于您的实际用例。
如果您希望其他人使用不适当的值调用此方法,您可能不应该使用异常,而只是不执行任何操作 - 因为异常应该用于异常情况,但话又说回来,这确实取决于您的用例。