Ed *_*d I 5 .net c# enums flags
我有一个模型必须处于以下互斥状态之一:New、In Progress或Closed。
该应用程序允许用户保存记录,然后通过提供匹配状态列表来检索它们。
我继承了一个 SQL 数据库,其中状态存储为表示按位标志的整数。我必须调用一个通过按位运算进行匹配的过程:
CREATE PROCEDURE SearchByState
@MatchingStates int
AS
BEGIN
SELECT Id, State
FROM Records
WHERE @MatchingStates & State > 0
END;
GO
Run Code Online (Sandbox Code Playgroud)
这对我来说一切都很好。
现在,在 C# 实现中,很明显我应该定义标志来表示查询中匹配状态的组合:
[Flags]
public enum States
{
None = 0x0,
New= 0x1,
InProgress = 0x2,
Closed = 0x4,
All = New | InProgress | Closed
}
Run Code Online (Sandbox Code Playgroud)
问题是记录的模型必须具有表示单个状态的属性。
问题是,这个记录的模型的State属性的类型应该是什么:
1)只需使用枚举标志:
public class Record
{
public int Id { get; set; }
// Must ensure the value is equal to one of
// States.New, States.InProgress, or States.Closed
public States State { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
2) 为互斥状态定义新的枚举类型:
public enum State
{
New,
InProgress,
Closed
}
public class Record
{
public int Id { get; set; }
// Must be stored as the value of one of
// States.New, States.InProgress, or States.Closed
public State State { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
#1 的缺点是语义:States 枚举代表状态的组合,而不是单个状态。
#2 的缺点是实用的:在存储状态时,我必须确定要存储的底层值。
您能想出一种方法来表示所有这些,同时最大限度地减少这些缺点吗?
我会将其保留为单个非标志枚举。
当您将其传递给过程时,您可以使用按位或 (|) 从枚举构建整数,甚至只需添加值(强制转换为 int)。我会尽量避免“破坏”您的逻辑以使单个遗留查询正常工作,而是重新编写调用查询以处理那里的异常要求的代码。
这使代码到处都保持干净。在你的情况下,“状态”不应该是一个标志枚举 - 只有一种可能的状态。