Побитовое ИЛИ как входной параметр в пользовательском атрибуте
Как передать несколько параметров с помощью побитовой операции ИЛИ в моем обычае 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 ответ
Решение
Определите вашу 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}");