我想给我的"用户" - 对象一些权限。该权限在枚举中定义。 为了便于理解,我发布了我的代码。
public class User
{
public string UserName { get; set; }
public string Password { get; set; }
public UserRights Permissions { get; set; }
public override string ToString()
{
return "Username: " + UserName + " - Password: " + Password + " - Permisssions: " + Permissions;
}
}
public enum UserRights
{
Admin,
SmallAdmin,
SimpleUser,
JustDummy
}
public class EnumFinder
{
public List<User> Users = new List<User>();
public EnumFinder()
{
CreateUsers();
List<User> search = (from a in Users where a.Permissions == UserRights.SimpleUser select a).ToList<User>();
foreach (User user in search)
{
Console.WriteLine(user.ToString());
}
}
/// <summary>
/// Create some example users and put the objects into User's list
/// </summary>
private void CreateUsers()
{
var user1 = new User();
user1.UserName = "user1";
user1.Password = "password1";
user1.Permissions = UserRights.Admin;
var user2 = new User();
user2.UserName = "user2";
user2.Password = "password2";
user2.Permissions = UserRights.SmallAdmin | UserRights.JustDummy;
var user3 = new User();
user3.UserName = "user3";
user3.Password = "password3";
user3.Permissions = UserRights.SimpleUser;
Users.Add(user1);
Users.Add(user2);
Users.Add(user3);
}
}
因此,正如您所看到的,我将一些示例用户添加到了我的用户列表中。他们每个人都有不同的权限。现在让我们说我想搜索每个用户和#34; Admin&#34;允许。 这工作正常(对于那个用户):
List<User> search = (from a in Users where a.Permissions == UserRights.Admin select a).ToList<User>();
但是我想说我正在寻找具有SmallAdmin权限的用户。所以我尝试了这个:
List<User> search = (from a in Users where a.Permissions == UserRights.SmallAdmin select a).ToList<User>();
在这种情况下,找不到用户。为什么不? 谢谢你的帮助。
答案 0 :(得分:4)
使用[Flags]
属性标记您的枚举,然后使用HasFlag
方法
List<User> search = (from a in Users
where a.Permissions.HasFlag(UserRights.SmallAdmin)
select a).ToList<User>();
答案 1 :(得分:1)
您可以将您的枚举用作标记,如UserRights.SmallAdmin | UserRights.JustDummy
所示。
执行此操作时,您必须使用枚举和的[Flags]
属性,同时确保枚举值或“枚举”值实际产生有意义的结果。
如果您将枚举更改为
[Flags]
public enum UserRights
{
Admin = 1,
SmallAdmin = 2,
SimpleUser = 4,
JustDummy = 8
}
那么你已经在UserRights.SmallAdmin | UserRights.JustDummy
的中途将等于10
,这对于那些旗帜组合是唯一的。
为了测试它,你必须使用二进制文件,例如:(value & UserRights.SmallAdmin) == UserRights.SmallAdmin
将返回是否设置了这个特定的标志。
实际上@ Selman22更好,但这表明它是如何在内部处理的。