使用在C#中传递null的选项将枚举传递给函数的干净方法

Chu*_*bur 1 c# null enums

我有一个代表物理结构的物体(如电线杆),它接触一堆其他物体(杆子上的电线).其他对象具有表示为枚举的一组特征(状态,大小,电压,相位等).我想编写一个通用函数来计算有多少线匹配任何或所有特征.

如果枚举是一流的对象,我想我只是写这个:

class Wire
{
    public EStatus Status { get; set; }
    public ESize Size { get; set; }
    public EVoltage Voltage { get; set; }
    public EPhase Phase { get; set; }
}

int CountWires(EStatus status, ESize size, EVoltage voltage, EPhase phase)
{
    int count = 0;
    foreach (Wire wire in _connectedWires)
    {
        if (status != null && wire.Status != status) continue;
        if (size != null && wire.Size != size) continue;
        //...
        ++count;
    }
    return count;
}
Run Code Online (Sandbox Code Playgroud)

......并且可以将其称为计算任何电压和相位的新的大电线,如下所示:

CountWires(EStatus.New, ESize.Large, null, null);
Run Code Online (Sandbox Code Playgroud)

...但当然这让我cannot convert from '<null>' to 'EVoltage'错了.

我们过去通过向枚举本身添加"任意"值并对其进行检查来解决这个问题,但是如果我们执行类似显示用户列表中所有可能值的操作,我们必须过滤掉"任意" .所以我想避免这种情况.

我以为我会把它扔给社区,看看是否有人有任何想法,通过一个干净的界面和易于阅读的调用代码来做到这一点.我有自己的答案,我将加入讨论.

Rob*_*vis 10

或者只使用可空类型.

int CountWires(EStatus? status, ESize? size, EVoltage? voltage, EPhase? phase)
{
    int count = 0;
    foreach (Wire wire in _connectedWires)
    {
        if (status.HasValue && wire.Status != status.Value) continue;
        if (size.HasValue && wire.Size != size.Value) continue;
        ...
        ++count;
    }
    return count;
}
Run Code Online (Sandbox Code Playgroud)