±à¼ÍƼö: |
±¾ÎÄÖ÷Òª½éÉÜÁËö¾Ù»ù´¡¡¢Óû§½ÇÉ«´æ´¢ÎÊÌ⡢ö¾ÙµÄ
Flags ÌØÐÔ¡¢½â¾öö¾ÙÖµ³åÍ»£º2 µÄÃݵÈÏà¹ØÄÚÈÝ¡£
±¾ÎÄÀ´×ÔÓÚÖªºõ£¬ÓÉ»ðÁú¹ûAnna±à¼ÍƼö |
|
ÎÄÕ¿ªÍ·Ïȸø´ó¼Ò³öÒ»µÀÃæÊÔÌ⣺
ÔÚÉè¼ÆÄ³Ð¡ÐÍÏîÄ¿µÄÊý¾Ý¿â£¨¼ÙÉèÓõÄÊÇ MySQL£©Ê±£¬Èç¹û¸øÓû§±í£¨User£©Ìí¼ÓÒ»¸ö×ֶΣ¨Roles£©ÓÃÀ´´æ´¢Óû§µÄ½ÇÉ«£¬Äã»á¸øÕâ¸ö×Ö¶ÎÉèÖÃʲôÀàÐÍ£¿Ìáʾ£ºÒª¿¼Âǵ½½ÇÉ«ÔÚºó¶Ë¿ª·¢Ê±ÐèÒªÓÃö¾Ù±íʾ£¬ÇÒÒ»¸öÓû§¿ÉÄÜ»áÓµÓжà¸ö½ÇÉ«¡£
Ó³ÈëÄãÄÔº£µÄµÚÒ»¸ö´ð°¸¿ÉÄÜÊÇ£ºvarchar ÀàÐÍ£¬Ó÷ָô·ûµÄ·½Ê½À´´æ´¢¶à¸ö½ÇÉ«£¬±ÈÈçÓà 1|2|3
»ò 1,2,3 À´±íʾÓû§ÓµÓжà¸ö½ÇÉ«¡£µ±È»Èç¹û½ÇÉ«ÊýÁ¿¿ÉÄܳ¬¹ý¸öλÊý£¬¿¼Âǵ½Êý¾Ý¿âµÄ²éѯ·½±ã£¨±ÈÈçÓÃ
INSTR »ò POSITION À´ÅжÏÓû§ÊÇ·ñ°üº¬Ä³¸ö½ÇÉ«£©£¬½ÇÉ«µÄÖµÖÁÉÙÒª´ÓÊý×Ö 10 ¿ªÊ¼¡£·½°¸ÊÇ¿ÉÐеģ¬¿ÉÊDz»ÊÇÌ«¼òµ¥ÁË£¬ÓÐûÓиüºÃµÄ·½°¸£¿¸üºÃµÄ»Ø´ðÓ¦ÊÇÕûÐÍ£¨int¡¢bigint
µÈ£©£¬ÓŵãÊÇд SQL ²éѯÌõ¼þ¸ü·½±ã£¬ÐÔÄÜ¡¢¿Õ¼äÉ϶¼ÓÅÓÚ varchar¡£µ«ÕûÐͱϾ¹Ö»ÊÇÒ»¸öÊý×Ö£¬Ôõô±íʾ¶à¸ö½ÇɫĨ£¿´ËʱÏëµ½Á˶þ½øÖÆÎ»²Ù×÷µÄÄ㣬ÐÄÖÐÓ¦¸ÃÔçÓÐÁ˴𰸡£ÇÒ±£ÁôÄãÐÄÖеĴ𰸣¬½Ó×Å¿´Íê±¾ÎÄ£¬»òÐíÄã»áÓÐÒâÍâµÄÊÕ»ñ£¬ÒòΪʵ¼ÊÓ¦ÓÃÖпÉÄÜ»¹»áÓöµ½Ò»Á¬´®µÄÎÊÌ⡣ΪÁ˸üºÃµÄ˵Ã÷ºóÃæµÄÎÊÌ⣬ÎÒÃÇÏÈÀ´»Ø¹ËÒ»ÏÂö¾ÙµÄ»ù´¡ÖªÊ¶¡£
ö¾Ù»ù´¡
ö¾ÙÀàÐ͵Ä×÷ÓÃÊÇÏÞÖÆÆä±äÁ¿Ö»ÄÜ´ÓÓÐÏÞµÄÑ¡ÏîÖÐȡֵ£¬ÕâЩѡÏö¾ÙÀàÐ͵ijÉÔ±£©¸÷×Ô¶ÔÓ¦ÓÚÒ»¸öÊý×Ö£¬Êý×ÖĬÈÏ´Ó
0 ¿ªÊ¼£¬²¢ÒԴ˵ÝÔö¡£ÀýÈ磺
public enum Days
{
Sunday, Monday, Tuesday, // ...
} |
ÆäÖÐ Sunday µÄÖµÊÇ 0£¬Monday ÊÇ 1£¬ÒÔ´ËÀàÍÆ¡£ÎªÁËÒ»ÑÛÄÜ¿´³öÿ¸ö³ÉÔ±´ú±íµÄÖµ£¬Ò»°ãÍÆ¼öÏÔʾµØ½«³ÉԱֵд³öÀ´£¬²»ÒªÊ¡ÂÔ£º
public enum Days
{
Sunday = 0, Monday = 1, Tuesday = 2, // ...
} |
C# ö¾Ù³ÉÔ±µÄÀàÐÍĬÈÏÊÇ int ÀàÐÍ£¬Í¨¹ý¼Ì³Ð¿ÉÒÔÉùÃ÷ö¾Ù³ÉԱΪÆäËüÀàÐÍ£¬±ÈÈ磺
public enum Days
: byte
{
Monday = 1,
Tuesday = 2,
Wednesday = 3,
Thursday = 4,
Friday = 5,
Saturday = 6,
Sunday = 7
} |
ö¾ÙÀàÐÍÒ»¶¨ÊǼ̳Ð×Ô byte¡¢sbyte¡¢short¡¢ushort¡¢int¡¢uint¡¢long
ºÍ ulong ÖеÄÒ»ÖÖ£¬²»ÄÜÊÇÆäËüÀàÐÍ¡£ÏÂÃæÊǼ¸¸öö¾ÙµÄ³£¼ûÓ÷¨£¨ÒÔÉÏÃæµÄ Days ö¾ÙΪÀý£©£º
// ö¾Ùת×Ö·û´®
string foo = Days.Saturday.ToString(); // "Saturday"
string foo = Enum.GetName(typeof(Days), 6); //
"Saturday"
// ×Ö·û´®×ªÃ¶¾Ù
Enum.TryParse("Tuesday", out Days bar);
// true, bar = Days.Tuesday
(Days)Enum.Parse(typeof(Days), "Tuesday");
// Days.Tuesday
// ö¾ÙתÊý×Ö
byte foo = (byte)Days.Monday; // 1
// Êý×Öתö¾Ù
Days foo = (Days)2; // Days.Tuesday
// »ñȡö¾ÙËùÊôµÄÊý×ÖÀàÐÍ
Type foo = Enum.GetUnderlyingType(typeof(Days)));
// System.Byte
// »ñÈ¡ËùÓеÄö¾Ù³ÉÔ±
Array foo = Enum.GetValues(typeof(MyEnum);
// »ñÈ¡ËùÓÐö¾Ù³ÉÔ±µÄ×Ö¶ÎÃû
string[] foo = Enum.GetNames(typeof(Days)); |
ÁíÍ⣬ֵµÃ×¢ÒâµÄÊÇ£¬Ã¶¾Ù¿ÉÄÜ»áµÃµ½·ÇÔ¤ÆÚµÄÖµ£¨ÖµÃ»ÓжÔÓ¦µÄ³ÉÔ±£©¡£±ÈÈ磺
Days d = (Days)21;
// ²»»á±¨´í
Enum.IsDefined(typeof(Days), d); // false
|
¼´Ê¹Ã¶¾ÙûÓÐֵΪ 0 µÄ³ÉÔ±£¬ËüµÄĬÈÏÖµÓÀÔ¶¶¼ÊÇ 0¡£
var z = default(Days);
// 0 |
ö¾Ù¿ÉÒÔͨ¹ý Description¡¢Display µÈÌØÐÔÀ´Îª³ÉÔ±Ìí¼ÓÓÐÓõĸ¨ÖúÐÅÏ¢£¬±ÈÈ磺
public enum ApiStatus
{
[Description("³É¹¦")]
OK = 0,
[Description("×ÊԴδÕÒµ½")]
NotFound = 2,
[Description("¾Ü¾ø·ÃÎÊ")]
AccessDenied = 3
}
static class EnumExtensions
{
public static string GetDescription(this Enum
val)
{
var field = val.GetType().GetField(val.ToString());
var customAttribute = Attribute.GetCustomAttribute(field,
typeof(DescriptionAttribute));
if (customAttribute == null) { return val.ToString();
}
else { return ((DescriptionAttribute) customAttribute).Description;
}
}
}
static void Main(string[] args)
{
Console.WriteLine(ApiStatus.Ok.GetDescription());
// "³É¹¦"
} |
ÉÏÃæÕâЩÎÒÈÏΪÒѾ°üº¬Á˴󲿷ÖÎÒÃÇÈÕ³£Óõ½µÄö¾Ù֪ʶÁË¡£ÏÂÃæÎÒÃǼÌÐø»Øµ½ÎÄÕ¿ªÍ·ËµµÄÓû§½ÇÉ«´æ´¢ÎÊÌâ¡£
Óû§½ÇÉ«´æ´¢ÎÊÌâ
ÎÒÃÇÏȶ¨ÒåÒ»¸öö¾ÙÀàÐÍÀ´±íʾÁ½ÖÖÓû§½ÇÉ«£º
public enum
Roles
{
Admin = 1,
Member = 2
}
|
ÕâÑù£¬Èç¹ûij¸öÓû§Í¬Ê±ÓµÓÐ Admin ºÍ Member Á½ÖÖ½ÇÉ«£¬ÄÇô
User ±íµÄ Roles ×ֶξÍÓ¦¸Ã´æ 3¡£ÄÇÎÊÌâÀ´ÁË£¬´ËʱÈô²éѯËùÓÐÓµÓÐ Admin ½ÇÉ«µÄÓû§µÄ
SQL ¸ÃÔõÃ´Ð´ÄØ£¿¶ÔÓÚÓлù´¡µÄ³ÌÐòÔ±À´Ëµ£¬Õâ¸öÎÊÌâºÜ¼òµ¥£¬Ö»ÒªÓÃλ²Ù×÷·ûÂß¼Ó루¡®&¡¯£©À´²éѯ¼´¿É¡£
SELECT * FROM `User` WHERE
`Roles` & 1 = 1; |
ͬÀí£¬²éѯͬʱӵÓÐÕâÁ½ÖÖ½ÇÉ«µÄÓû§£¬SQL Óï¾äÓ¦¸ÃÕâôд£º
SELECT * FROM `User` WHERE
`Roles` & 3 = 3; |
¶ÔÕâÌõ SQL Óï¾äÓà C# À´ÊµÏÖ²éѯÊÇÕâÑùµÄ£¨ÎªÁ˼òµ¥£¬ÕâÀïʹÓÃÁË
Dapper£©£º
public class User
{
public int Id { get; set; }
public Roles Roles { get; set; }
}
connection.Query<User>(
"SELECT * FROM `User` WHERE `Roles` &
@roles = @roles;",
new { roles = Roles.Admin | Roles.Member }); |
¶ÔÓ¦µÄ£¬ÔÚ C# ÖÐÒªÅжÏÓû§ÊÇ·ñÓµÓÐij¸ö½ÇÉ«£¬¿ÉÒÔÕâôÅжϣº
// ·½Ê½Ò»
if ((user.Roles & Roles.Admin) == Roles.Admin)
{
// ×ö¹ÜÀíÔ±¿ÉÒÔ×öµÄÊÂÇé
}
// ·½Ê½¶þ
if (user.Roles.HasFlag(Roles.Admin))
{
// ×ö¹ÜÀíÔ±¿ÉÒÔ×öµÄÊÂÇé
}
|
ͬÀí£¬ÔÚ C# ÖÐÄã¿ÉÒÔ¶Ôö¾Ù½øÐÐÈÎÒâλÂß¼ÔËË㣬±ÈÈçÒª°Ñ½ÇÉ«´Óij¸öö¾Ù±äÁ¿ÖÐÒÆ³ý£º
var foo = Roles.Admin | Roles.Member;
var bar = foo & ~Roles.Admin;
|
Õâ¾Í½â¾öÁËÎÄÕÂÇ°ÃæÌáµ½µÄÓÃÕûÐÍÀ´´æ´¢¶à½ÇÉ«µÄÎÊÌ⣬²»ÂÛÊý¾Ý¿â»¹ÊÇ C# ÓïÑÔ£¬²Ù×÷É϶¼ÊÇ¿ÉÐе쬶øÇÒÒ²ºÜ·½±ãÁé»î¡£
ö¾ÙµÄ Flags ÌØÐÔ
ÏÂÃæÎÒÃÇÌṩһ¸öͨ¹ý½ÇÉ«À´²éѯÓû§µÄ·½·¨£¬²¢ÑÝʾÈçºÎµ÷Óã¬ÈçÏ£º
public IEnumerable<User>
GetUsersInRoles(Roles roles)
{
_logger.LogDebug(roles.ToString());
_connection.Query<User>( "SELECT
* FROM `User` WHERE `Roles` & @roles = @roles;",
new { roles });
}
// µ÷ÓÃ
_repository.GetUsersInRoles(Roles.Admin | Roles.Member); |
Roles.Admin | Roles.Member µÄÖµÊÇ 3£¬ÓÉÓÚ
Roles ö¾ÙÀàÐÍÖв¢Ã»Óж¨ÒåÒ»¸öֵΪ 3 µÄ×ֶΣ¬ËùÒÔÔÚ·½·¨ÄÚ roles ²ÎÊýÏÔʾµÄÊÇ 3¡£3
Õâ¸öÐÅÏ¢¶ÔÓÚÎÒÃǵ÷ÊÔ»ò´òÓ¡ÈÕÖ¾ºÜ²»ÓѺá£ÔÚ·½·¨ÄÚ£¬ÎÒÃDz¢²»ÖªµÀÕâ¸ö 3 ´ú±íµÄÊÇʲô¡£ÎªÁ˽â¾öÕâ¸öÎÊÌ⣬C#
ö¾ÙÓиöºÜÓÐÓõÄÌØÐÔ£ºFlagsAtrribute¡£
[Flags]
public enum Roles
{
Admin = 1,
Member = 2
}
|
¼ÓÉÏÕâ¸ö Flags ÌØÐÔºó£¬ÎÒÃÇÔÙÀ´µ÷ÊÔ GetUsersInRoles(Roles
roles) ·½·¨Ê±£¬roles ²ÎÊýµÄÖµ¾Í»áÏÔʾΪ Admin|Member ÁË¡£¼òµ¥À´Ëµ£¬¼Ó²»¼Ó
Flags µÄÇø±ðÊÇ£º
var roles = Roles.Admin |
Roles.Member;
Console.WriteLing(roles.ToString()); // "3"£¬Ã»ÓÐ
Flags ÌØÐÔ
Console.WriteLing(roles.ToString()); // "Admin,
Member"£¬ÓÐ Flags ÌØÐÔ |
¸øÃ¶¾Ù¼ÓÉÏ Flags ÌØÐÔ£¬ÎÒ¾õµÃÓ¦µ±ÊÓΪ C# ±à³ÌµÄÒ»ÖÖ×î¼Ñʵ¼ù£¬ÔÚ¶¨Òåö¾Ùʱ¾¡Á¿¼ÓÉÏ Flags
ÌØÐÔ¡£
½â¾öö¾ÙÖµ³åÍ»£º2 µÄÃÝ
µ½Õ⣬ö¾ÙÀàÐÍ Roles Ò»Çп´ÉÏȥûʲôÎÊÌ⣬µ«Èç¹ûÏÖÔÚÒªÔö¼ÓÒ»¸ö½ÇÉ«£ºMananger£¬»á·¢ÉúʲôÇé¿ö£¿°´ÕÕÊý×ÖÖµµÝÔöµÄ¹æÔò£¬Manager
µÄÖµÓ¦µ±ÉèΪ 3¡£
[Flags]
public enum Roles
{
Admin = 1,
Member = 2,
Manager = 3
} |
Äܲ»ÄÜ°Ñ Manager µÄÖµÉèΪ 3£¿ÏÔÈ»²»ÄÜ£¬ÒòΪ Admin
ºÍ Member ½øÐÐλµÄ»òÂß¼ÔËË㣨¼´£ºAdmin | Member£© µÄÖµÒ²ÊÇ 3£¬±íʾͬʱӵÓÐÕâÁ½ÖÖ½ÇÉ«£¬ÕâºÍ
Manager ³åÍ»ÁË¡£ÄÇÔõÑùÉèÖµ²ÅÄܱÜÃâ³åÍ»ÄØ£¿¼ÈÈ»ÊǶþ½øÖÆÂß¼ÔËËã¡°»ò¡±»áºÍ³ÉÔ±Öµ²úÉú³åÍ»£¬ÄǾÍÀûÓÃÂß¼ÔËËã»òµÄ¹æÂÉÀ´½â¾ö¡£ÎÒÃÇÖªµÀ¡°»ò¡±ÔËËãµÄÂß¼ÊÇÁ½±ßÖ»Òª³öÏÖÒ»¸ö
1 ½á¹û¾Í»á 1£¬±ÈÈç 1|1¡¢1|0 ½á¹û¶¼ÊÇ 1£¬Ö»ÓÐ 0|0 µÄÇé¿ö½á¹û²ÅÊÇ 0¡£ÄÇôÎÒÃǾÍÒª±ÜÃâÈÎÒâÁ½¸öÖµÔÚÏàͬµÄλÖÃÉϳöÏÖ
1¡£¸ù¾Ý¶þ½øÖÆÂú 2 ½ø 1 µÄÌØµã£¬Ö»Òª±£Ö¤Ã¶¾ÙµÄ¸÷ÏîÖµ¶¼ÊÇ 2 µÄÃݼ´¿É¡£±ÈÈ磺
1: 00000001
2: 00000010
4: 00000100
8: 00001000 |
ÔÙÍùºóÔö¼ÓµÄ»°¾ÍÊÇ 16¡¢32¡¢64...£¬ÆäÖи÷Öµ²»ÂÛÔõôÏà¼Ó¶¼²»»áºÍ³ÉÔ±µÄÈÎÒ»Öµ³åÍ»¡£ÕâÑùÎÊÌâ¾Í½â¾öÁË£¬ËùÒÔÎÒÃÇÒªÕâÑù¶¨Òå
Roles ö¾ÙµÄÖµ£º
[Flags]
public enum Roles
{
Admin = 1,
Member = 2,
Manager = 4,
Operator = 8
} |
²»¹ýÔÚ¶¨ÒåÖµµÄʱºòÒªÔÚÐÄÖÐСС¼ÆËãһϣ¬Èç¹ûÄãÏëÀÁÒ»µã£¬¿ÉÒÔÓÃÏÂÃæÕâÖÖ¡°Î»ÒÆ¡±µÄ·½·¨À´¶¨Ò壺
[Flags]
public enum Roles
{
Admin = 1 << 0,
Member = 1 << 1,
Manager = 1 << 2,
Operator = 1 << 3
} |
Ò»Ö±ÍùϵÝÔö±àÖµ¼´¿É£¬ÔĶÁÌåÑéºÃ£¬Ò²²»ÈÝÒ×±à´í¡£Á½ÖÖ·½Ê½ÊǵÈЧµÄ£¬³£Á¿Î»ÒƵļÆËãÊÇÔÚ±àÒëµÄʱºò½øÐеģ¬ËùÒÔÏà±È²»»áÓжîÍâµÄ¿ªÏú¡£
×ܽá
±¾ÎÄͨ¹ýÒ»µÀССµÄÃæÊÔÌâÒý·¢Ò»Á¬´®¶Ôö¾ÙµÄ˼¿¼¡£ÔÚСÐÍϵͳÖУ¬°ÑÓû§½Çɫֱ½Ó´æ´¢ÔÚÓû§±íÊǺܳ£¼ûµÄ×ö·¨£¬´Ëʱ°Ñ½ÇÉ«×Ö¶ÎÉèΪÕûÐÍ£¨±ÈÈç
int£©ÊDZȽϺõÄÉè¼Æ·½°¸¡£µ«Óë´Ëͬʱ£¬Ò²Òª¿¼Âǵ½Ò»Ð©×î¼Ñʵ¼ù£¬±ÈÈçʹÓà Flags ÌØÐÔÀ´°ïÖú¸üºÃµÄµ÷ÊÔºÍÈÕÖ¾Êä³ö¡£Ò²Òª¿¼Âǵ½Êµ¼Ê¿ª·¢Öеĸ÷ÖÖDZÔÚÎÊÌ⣬±ÈÈç¶à¸öö¾ÙÖµ½øÐлò£¨¡®|¡¯£©ÔËËãÓë³ÉÔ±Öµ·¢Éú³åÍ»µÄÎÊÌâ¡£ |