Domanda

In C# esiste un modo abbreviato per scrivere questo:

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

Come:

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

So che potrei anche usare switch, ma probabilmente ci sono circa 50 funzioni come questa che devo scrivere (portando un classico sito ASP su ASP.NET), quindi vorrei mantenerle il più brevi possibile.

È stato utile?

Soluzione

Cosa ne pensi di questo?

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

Utilizzo:

Personnel userId = Personnel.JohnDoe;

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

Non posso rivendicarne il merito, ma non riesco nemmeno a ricordare dove l'ho visto.Quindi, merito tuo, anonimo sconosciuto di Internet.

Altri suggerimenti

Che ne dici di qualcosa del genere:

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

(Ovviamente potresti modificare lo stato statico, inizializzare la classe ID in qualche altro posto, utilizzare un IEnumerable<>, ecc., in base alle tue esigenze.Il punto principale è che l'equivalente più vicino al In operatore in SQL è la funzione Collection.Contains().)

Vorrei incapsulare l'elenco degli ID consentiti come dati non codice.Quindi la sua fonte può essere modificata facilmente in seguito.

List<int> allowedIDs = ...;

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

Se si utilizza .NET 3.5, è possibile utilizzare IEnumerable invece di List grazie ai metodi di estensione.

(Questa funzione non dovrebbe essere statica.Vedi questo messaggio: usare troppa elettricità statica, male o bene?.)

Le autorizzazioni sono basate sull'ID utente?In tal caso, potresti trovare una soluzione migliore accedendo alle autorizzazioni basate sul ruolo.Oppure potresti dover modificare quel metodo abbastanza frequentemente per aggiungere ulteriori utenti all'elenco "utenti consentiti".

Ad esempio, Enum UserRole {User, amministratore, 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 piccolo trucco carino è invertire il modo in cui usi solitamente .Contains(), come: -

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

Dove puoi inserire nell'array tutte le voci che desideri.

Se Personnel.x è un'enumerazione, avresti alcuni problemi di casting con questo (e con il codice originale che hai pubblicato), e in tal caso sarebbe più facile da usare: -

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

Ecco il più vicino che mi viene in mente:

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

Puoi scrivere un iteratore per Personnel.

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

Solo un'altra idea di sintassi:

return new [] { Personnel.JohnDoe, Personnel.JaneDoe }.Contains(userID);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top