usuarios - Condicional de taquigrafía en C#similar a la palabra clave SQL ''in''
login y autenticación de tipos de usuario con visual c# y sql server (8)
En C # hay una forma abreviada de escribir esto:
public static bool IsAllowed(int userID)
{
return (userID == Personnel.JohnDoe || userID == Personnel.JaneDoe ...);
}
Me gusta:
public static bool IsAllowed(int userID)
{
return (userID in Personnel.JohnDoe, Personnel.JaneDoe ...);
}
Sé que también podría usar el modificador, pero probablemente haya unas 50 funciones como esta que tengo que escribir (portar un sitio ASP clásico a ASP.NET), por lo que me gustaría mantenerlas lo más cortas posible.
¿Los permisos están basados en ID de usuario? Si es así, puede terminar con una mejor solución yendo a los permisos basados en roles. O puede terminar teniendo que editar ese método con bastante frecuencia para agregar usuarios adicionales a la lista de "usuarios permitidos".
Por ejemplo, enum UserRole {User, Administrator, 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;
}
¿Puedes escribir un iterador para 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;
}
¿Qué tal 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
}
No puedo reclamar el mérito por esto, pero tampoco puedo recordar dónde lo vi. Entonces, crédito para usted, extraño anónimo de Internet.
Encapsularía la lista de ID permitidos como datos, no como código . Entonces su fuente puede cambiarse fácilmente más adelante.
List<int> allowedIDs = ...;
public bool IsAllowed(int userID)
{
return allowedIDs.Contains(userID);
}
Si usa .NET 3.5, puede usar IEnumerable
lugar de List
gracias a los métodos de extensión.
(Esta función no debe ser estática. Consulte esta publicación: ¿ usar demasiado estático está mal o bien? ).
Esto es lo 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);
}
Qué tal algo como esto:
public static bool IsAllowed(int userID) {
List<int> IDs = new List<string> { 1,2,3,4,5 };
return IDs.Contains(userID);
}
(Por supuesto, puede cambiar el estado estático, inicializar la clase ID en otro lugar, usar un IEnumerable <>, etc., según sus necesidades. El punto principal es que el equivalente más cercano al operador in en SQL es la Colección. Contiene la función ())
Solo otra idea de sintaxis:
return new [] { Personnel.JohnDoe, Personnel.JaneDoe }.Contains(userID);
Un pequeño y agradable truco es revertir de la manera en que generalmente usas .Contains (), como: -
public static bool IsAllowed(int userID) {
return new int[] { Personnel.JaneDoe, Personnel.JohnDoe }.Contains(userID);
}
Donde puede poner tantas entradas en la matriz como desee.
Si Personnel.x es una enumeración, tendrías algunos problemas de transmisión con esto (y con el código original que publicaste), y en ese caso sería más fácil de usar: -
public static bool IsAllowed(int userID) {
return Enum.IsDefined(typeof(Personnel), userID);
}