11

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

switch も使用できることはわかっていますが、おそらく 50 ほどの関数を記述しなければならない (従来の ASP サイトを ASP.NET に移植する) 必要があるため、できるだけ短くしたいと思います。

4

8 に答える 8

13

これはどう?

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
}

これについては信用できませんが、どこで見たかも思い出せません。だから、あなたの功績、匿名のインターネットの見知らぬ人。

于 2008-08-28T19:51:51.407 に答える
4

このようなものはどうですか:

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

(もちろん、必要に応じて、静的ステータスを変更したり、別の場所で ID クラスを初期化したり、IEnumerable<> を使用したりすることもできます。主なポイントは、SQL のin演算子に最も近いものは Collection であるということです。 Contains() 関数です。)

于 2008-08-28T18:04:36.377 に答える
2

許可された ID のリストをcodeではなくdataとしてカプセル化します。その後、ソースは後で簡単に変更できます。

List<int> allowedIDs = ...;

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

.NET 3.5 を使用している場合は、拡張メソッドのおかげでIEnumerable代わりに使用できます。List

(この関数は静的であってはなりません。この投稿を参照してください: using too much static bad or good ? .)

于 2008-08-28T18:03:48.123 に答える
1

アクセス許可はユーザー ID ベースですか? その場合は、役割ベースのアクセス許可に進むことで、より良い解決策になる可能性があります。または、そのメソッドを頻繁に編集して、追加のユーザーを「許可されたユーザー」リストに追加する必要が生じる場合があります。

たとえば、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;
}
于 2008-08-28T18:07:22.267 に答える
0

素敵なちょっとしたトリックは、.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);
}
于 2008-08-28T18:27:50.547 に答える
0

これが私が考えることができる最も近いものです:

using System.Linq;
public static bool IsAllowed(int userID)
{
  return new Personnel[]
      { Personnel.JohnDoe, Personnel.JaneDoe }.Contains((Personnel)userID);
}
于 2008-08-28T18:28:21.810 に答える
0

ちょうど別の構文のアイデア:

return new [] { Personnel.JohnDoe, Personnel.JaneDoe }.Contains(userID);
于 2008-08-28T18:29:17.347 に答える
0

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;
}
于 2008-08-28T18:32:29.960 に答える