Pregunta

En C# hay una manera abreviada de escribir este:

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

Sé que podría también utilizar el interruptor, pero probablemente hay 50 o más funciones, como esta que tengo que escribir (trasladar un ASP clásico sitio a ASP.NET) así que me gustaría mantenerlos lo más corto posible.

¿Fue útil?

Solución

¿Qué hay de esto?

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
}

Yo no puede reclamar el crédito por esto, pero también no puedo recordar dónde lo vi.Así, el crédito a usted, anónimo de Internet extraño.

Otros consejos

¿Algo como esto:

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

(Usted podría, por supuesto, cambiar el estado estáticos, inicializar los Identificadores de clase en algún otro lugar, utilice un IEnumerable<>, etc, en base a sus necesidades.El punto principal es que el equivalente más cercano a la en operador en SQL es la Colección.Función Contains ().)

Me gustaría encapsular la lista de los permitidos IDs como datos no código.Entonces es la fuente puede ser cambiado fácilmente más tarde.

List<int> allowedIDs = ...;

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

Si va a usar .NET 3.5, se puede utilizar IEnumerable en lugar de List gracias a los métodos de extensión.

(Esta función no debe ser estático.Ver esta publicación: usar demasiado estático malo o bueno ?.)

Son permisos de usuario-id?Si es así, usted puede terminar para arriba con una solución mejor por ir a rol basado en permisos.O usted puede terminar encima de tener que editar ese método con bastante frecuencia para agregar usuarios adicionales a la "permitía a los usuarios" de la lista.

Por ejemplo, enum UserRole { Usuario, Administrador, 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;
}

Un buen truco es una especie de reverso de la forma de uso .Contains(), como:-

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

Donde usted puede poner muchas entradas en la matriz como te gusta.

Si el Personal.x es una enumeración tendrías alguna de fundición problemas con esto (y con el código original que has publicado), y en ese caso sería más fácil de utilizar:-

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

Aquí está el más cercano que se me ocurre:

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

Puedes escribir un iterador para el Personal.

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

Sólo otra sintaxis idea:

return new [] { Personnel.JohnDoe, Personnel.JaneDoe }.Contains(userID);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top