Pergunta

Em C# existe uma maneira abreviada de escrever isso:

public static bool IsAllowed(int userID)
{
    return (userID == Personnel.JohnDoe || userID == Personnel.JaneDoe ...);
}

Como:

public static bool IsAllowed(int userID)
{
    return (userID in Personnel.JohnDoe, Personnel.JaneDoe ...);
}

Eu sei que também poderia usar o switch, mas provavelmente há cerca de 50 funções como essa que preciso escrever (portando um site ASP clássico para o ASP.NET), então gostaria de mantê-las o mais curtas possível.

Foi útil?

Solução

Que tal agora?

public static class Extensions
{
    public static bool In<T>(this T testValue, params T[] values)
    {
        return values.Contains(testValue);
    }
}

Uso:

Personnel userId = Personnel.JohnDoe;

if (userId.In(Personnel.JohnDoe, Personnel.JaneDoe))
{
    // Do something
}

Não posso reivindicar o crédito por isso, mas também não me lembro onde o vi.Então, crédito para você, estranho anônimo da Internet.

Outras dicas

Que tal algo como isso:

public static bool IsAllowed(int userID) {
  List<int> IDs = new List<string> { 1,2,3,4,5 };
  return IDs.Contains(userID);
}

(É claro que você pode alterar o status estático, inicializar a classe IDs em algum outro lugar, usar um IEnumerable<>, etc., com base em suas necessidades.O ponto principal é que o equivalente mais próximo do em operador em SQL é a função Collection.Contains().)

Eu encapsularia a lista de IDs permitidos como dados não código.Então sua fonte pode ser alterada facilmente mais tarde.

List<int> allowedIDs = ...;

public bool IsAllowed(int userID)
{
    return allowedIDs.Contains(userID);
}

Se estiver usando o .NET 3.5, você pode usar IEnumerable em vez de List graças aos métodos de extensão.

(Esta função não deve ser estática.Veja esta postagem: usar muita estática é ruim ou bom?.)

As permissões são baseadas no ID do usuário?Nesse caso, você pode encontrar uma solução melhor acessando as permissões baseadas em funções.Ou você pode acabar tendo que editar esse método com bastante frequência para adicionar usuários adicionais à lista de “usuários permitidos”.

Por exemplo, enum userrole {usuário, administrador, lordeemperor}

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;
}

Um pequeno truque legal é reverter a maneira como você costuma usar .Contains (), como: -

public static bool IsAllowed(int userID) {
  return new int[] { Personnel.JaneDoe, Personnel.JohnDoe }.Contains(userID);
}

Onde você pode colocar quantas entradas desejar no array.

Se Personnel.x for um enum, você terá alguns problemas de transmissão com isso (e com o código original que postou) e, nesse caso, seria mais fácil de usar: -

public static bool IsAllowed(int userID) {
  return Enum.IsDefined(typeof(Personnel), userID);
}

Aqui está o mais próximo que consigo pensar:

using System.Linq;
public static bool IsAllowed(int userID)
{
  return new Personnel[]
      { Personnel.JohnDoe, Personnel.JaneDoe }.Contains((Personnel)userID);
}

Você pode escrever um iterador para Pessoal.

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;
}

Apenas mais uma ideia de sintaxe:

return new [] { Personnel.JohnDoe, Personnel.JaneDoe }.Contains(userID);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top