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

(您当然可以更改静态状态,在其他地方初始化 IDs 类,使用 IEnumerable<> 等,根据您的需要。重点是与SQL 中的in运算符最接近的是 Collection。包含()函数。)

于 2008-08-28T18:04:36.377 回答
2

我会将允许的 ID 列表封装为data而不是code。然后它的来源可以在以后轻松更改。

List<int> allowedIDs = ...;

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

如果使用 .NET 3.5,您可以使用扩展方法IEnumerable而不是List感谢。

(此功能不应该是静态的。请参阅此帖子:使用过多的静态坏或好?。)

于 2008-08-28T18:03:48.123 回答
1

权限是否基于用户 ID?如果是这样,您可能会通过基于角色的权限获得更好的解决方案。或者您最终可能不得不频繁地编辑该方法以将其他用户添加到“允许的用户”列表中。

例如,枚举 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 回答