В C# есть сокращенный способ записать это:
public static bool IsAllowed(int userID)
{
return (userID == Personnel.JohnDoe || userID == Personnel.JaneDoe ...);
}
Нравиться:
public static bool IsAllowed(int userID)
{
return (userID in Personnel.JohnDoe, Personnel.JaneDoe ...);
}
Я знаю, что могу также использовать переключатель, но я должен написать около 50 или около того таких функций (перенос классического сайта ASP на ASP.NET), поэтому я хотел бы сделать их как можно короче.





Я бы инкапсулировал список разрешенных идентификаторов как данные, а не код. Тогда его источник можно будет легко изменить позже.
List<int> allowedIDs = ...;
public bool IsAllowed(int userID)
{
return allowedIDs.Contains(userID);
}
При использовании .NET 3.5 вы можете использовать IEnumerable вместо List благодаря методам расширения.
(Эта функция не должна быть статической. См. Это сообщение: использование слишком большого количества статического электричества - плохо или хорошо?.)
Как насчет чего-то вроде этого:
public static bool IsAllowed(int userID) {
List<int> IDs = new List<string> { 1,2,3,4,5 };
return IDs.Contains(userID);
}
(Вы, конечно, можете изменить статический статус, инициализировать класс идентификаторов в другом месте, использовать IEnumerable и т. д., В зависимости от ваших потребностей. Главное, что ближайшим эквивалентом оператора в в SQL является Collection.Contains ( ) функция.)
Основаны ли разрешения на идентификаторе пользователя? Если это так, вы можете найти лучшее решение, перейдя к разрешениям на основе ролей. Или вам может потребоваться довольно часто редактировать этот метод, чтобы добавить дополнительных пользователей в список «разрешенных пользователей».
Например, enum UserRole { Пользователь, Администратор, LordEmperor }
class User {
public UserRole Role{get; set;}
public string Name {get; set;}
public int UserId {get; set;}
}
public static bool IsAllowed(User user) {
return user.Role == UserRole.LordEmperor;
}
Небольшой приятный трюк состоит в том, чтобы поменять местами тот способ, которым вы обычно пользуетесь .Contains (), например: -
public static bool IsAllowed(int userID) {
return new int[] { Personnel.JaneDoe, Personnel.JohnDoe }.Contains(userID);
}
Где вы можете поместить столько записей в массив, сколько захотите.
Если Personnel.x является перечислением, у вас возникнут проблемы с приведением к нему (и с исходным кодом, который вы опубликовали), и в этом случае было бы проще использовать: -
public static bool IsAllowed(int userID) {
return Enum.IsDefined(typeof(Personnel), userID);
}
Вот самое близкое, что я могу придумать:
using System.Linq;
public static bool IsAllowed(int userID)
{
return new Personnel[]
{ Personnel.JohnDoe, Personnel.JaneDoe }.Contains((Personnel)userID);
}
Еще одна идея синтаксиса:
return new [] { Personnel.JohnDoe, Personnel.JaneDoe }.Contains(userID);
Вы можете написать итератор для персонала.
public static bool IsAllowed(int userID)
{
return (Personnel.Contains(userID))
}
public bool Contains(int userID) : extends Personnel (i think that is how it is written)
{
foreach (int id in Personnel)
if (id == userid)
return true;
return false;
}
Как насчет этого?
public static class Extensions
{
public static bool In<T>(this T testValue, params T[] values)
{
return values.Contains(testValue);
}
}
Использование:
Personnel userId = Personnel.JohnDoe;
if (userId.In(Personnel.JohnDoe, Personnel.JaneDoe))
{
// Do something
}
Я не могу претендовать на это, но я также не могу вспомнить, где я это видел. Итак, кредит вам, анонимный интернет-незнакомец.
Я бы с удовольствием это сделал, но, к сожалению, мы слишком глубоко увязли в устаревшем коде.