Visual Studio 在C#中创建基于枚举的构造函数

ltqd579y  于 2023-05-07  发布在  C#
关注(0)|答案(3)|浏览(229)

在我的项目中,我有以下枚举:

public enum LicenseStateType
{
    Valid,
    Expiring,
    Expired
}

和以下表示许可证状态的类:

public class LicenseState
{
    public LicenseStateType State { get; protected set; }
    public int DaysLeft { get; protected set; }
}

在我的场景中,当LicenseStateType == LicenseStateType.ValidLicenseStateType == LicenseStateType.Expired时,我会创建一个像LicenseState(LicenseStateType Type)这样的构造函数,但当LicenseStateType == LicenseStateType.Expiring时,我会发送剩余的天数来调用像LicenseState(LicenseStateType.Expiring, int daysleft)这样的构造函数。
我该怎么做?或者有更好的方法来做到这一点吗?

bq8i3lrv

bq8i3lrv1#

没有编译时的方法可以根据参数的 * 值 * 来强制执行不同的编译器签名。所以我有几个选择:

  • 使DaysLeft成为一个 * 可选 * 编译器参数,并在运行时验证它
  • 有一个名为ExpiringLicenseState的不同类型,它只接受DaysLeft构造函数参数并将LicenseStateType.Expiring传递给基构造函数。您还可以将DaysLeft属性移到该类中,因为它是唯一与之明显相关的状态。

如果您在编译时知道许可证是否过期,那么第二个许可证将为您提供更好的编译时安全性。如果您在编译时不知道,那么运行时检查会更清楚。

fhg3lkii

fhg3lkii2#

为什么不使用一个构造函数来传递剩余天数,并让内部逻辑决定其状态?例如:

public LicenseState(int daysLeft)
{
    switch(daysLeft)
    {
        case <= 0:
            State = LicenseStateType.Expired;
            break;

        case <= 7:
            State = LicenseStateType.Expiring;
            break;

        default:
            State = LicenseStateType.Valid;
            break;
    };
}

然后,您可以删除DaysLeft属性,在我看来,这是毫无意义的。

9o685dep

9o685dep3#

可以使用私有构造函数。然后创建公共静态方法来创建类的对象,这些对象强制执行所需的行为。只有当您创建一个即将到期的许可证时,才有可能传递剩余的天数:

public class LicenseState
{
    public LicenseStateType State { get; protected set; }
    public int DaysLeft { get; protected set; }

    private LicenseState(LicenseStateType  state, int daysLeft)
    {
       State = state;
       DaysLeft = daysLeft;
    }

    public static LicenseState CreateValidLicense() => new LicenseState(LicenseStateType.Valid, 0);

    public static LicenseState CreateExpiredLicense() => new LicenseState(LicenseStateType.Expired, 0);

    public static LicenseState CreateExpiringLicense(int daysLeft) => new LicenseState(LicenseStateType.Expiring, daysLeft);
}

相关问题