Побитовое ИЛИ как входной параметр в пользовательском атрибуте - PullRequest
0 голосов
/ 04 декабря 2018

Как передать несколько параметров с помощью побитовой операции ИЛИ в моем пользовательском атрибуте FeatureAuthorize, таким же образом AttributeUsage поддерживает AttributeTarget в качестве метода или класса.

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]

Ниже приведен пример, который яЕсли вы хотите достичь, любая доступная функция должна быть доступна для отправки или получения денег.

[FeatureAuthorize(Feature = EnumFeature.SendMoney | EnumFeature.ReceiveMoney)]
public ActionResult SendOrReceiveMoney(int? id, EnumBankAccountType? type)
{
 // My code
}

Тело атрибута FeatureAuthorize похоже на

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class FeatureAuthorizeAttribute : AuthorizeAttribute
{
    public EnumFeature Feature { get; set; }

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        if (!IsFeatureAllowed(Feature)) // Verification in database.
        {
             // Redirection to not authorize page.
        }
    }
}

Заранее спасибо.

1 Ответ

0 голосов
/ 04 декабря 2018

Определите вашу EnumFeature следующим образом:

[Flags]
public enum EnumFeature {
  Send = 1,
  Received = 2,
  BalanceEnquery = 4,
  CloseAccount = 8
}

Обратите внимание, что каждое последующее значение перечисления является следующей наивысшей степенью 2. В вашем атрибуте auth вы можете использовать Enum.HasFlag дляпосмотрите, установлен ли флаг.Но вы, вероятно, захотите убедиться, что другие флаги не установлены с помощью других побитовых операций.

Что-то вроде этого

var acceptable = EnumFeature.Send | EnumFeature.Received;
var input = EnumFeature.Send | EnumFeature. CloseAccount;

// Negate the values which are acceptable, then we'll AND with the input; if that result is 0, then we didn't get any invalid flags set.  We can then use HasFlag to see if we got Send or Received
var clearAcceptable = ~acceptable;
Console.WriteLine($"Input valid: {(input & clearAcceptable) == 0}");
...