将许多类传递给方法

时间:2017-03-02 08:31:13

标签: c# linq class arguments

一天的美好时光!
我正在尝试传递几个继承自一个基类的类 结构如下:

  • 权限类 - 用户的权限
    • 编辑:权限 - 能够编辑记录
    • 删除:权限 - 能够删除记录
    • 创建:权限 - 能够创建记录
  • 用户类 - 用户类
    • 私有权限[]权限 - 可供用户使用的权限
    • public void AddDefaultPermissions(Permission [] permissions)

我无法弄清楚的是,如何将多个权限传递给此函数并检查是否已添加权限。我想的是允许类似下面的方法调用:

AddDefaultPermissions(Edit, Delete, Create);

权限类:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;

public class Permission {

private int permissionID;
private string permissionName;
private string permissionDescription;
private int accessStartTimestamp;
private int accessEndTimestamp;

public int PermissionID {
    get { return permissionID; }
    set { permissionID = value; }
}

public string PermissionName {
    get { return permissionName; }
    set { permissionName = value; }
}

public string PermissionDescription {
    get { return permissionDescription; }
    set { permissionDescription = value; }
}

public int AccessStartTimestamp {
    get { return accessStartTimestamp; }
    set { accessStartTimestamp = value; }
}

public int AccessEndTimestamp {
    get { return accessEndTimestamp; }
    set { accessEndTimestamp = value; }
}
}

编辑课程:

using System;
using System.Collections;
using System.Collections.Generic;

public class Edit : Permission {

public Edit() {
    PermissionID = 1;
    PermissionName = "Edit";
    PermissionDescription = "Allow user to edit records";
    AccessStartTimestamp = 1488369600;
    AccessEndTimestamp = 1491048000;
}

}

要检查权限是否已存在,可以使用PermissionID变量。此变量由所有权限类继承,并且对于权限是唯一的(Edit = 1,Create = 2,Delete = 3);

我在LINQ中看到了一些示例,但无法使其工作,因为实际上从未使用过LINQ。 是否可以实现此功能+以检查是否已添加权限以避免重复?

2 个答案:

答案 0 :(得分:2)

您可以使用params语法传递任意数量的权限:

AddDefaultPermissions(params Permission[] permissions) {
}

要检查多次使用哪个权限,请分组和检查计数:

foreach (var pg in permissions.GroupBy(p => p).Where(g => g.Count() > 1) {
    Console.WriteLine("Permission {0} is used {1} times.", pg.Key, pg.Count());
}

重要提示:仅当Permission类正确实施EqualsGetHashCode方法时,上述内容才有效。

答案 1 :(得分:2)

您可以使用Distinct轻松删除输入中的重复项:

AddDefaultPermissions(params Permission[] permissions) 
{
    var actualPermissions = permissions.Distinct();
}

这假定您的Permission - 类通过比较Equals - 属性来适当地实现GetHashCoePermissionID,例如:

class Permission
{
    public override bool Equals(object obj)
    {
        var p = obj as Permission;
        if(p == null) return false;
        return this.PermissionID == p.PermissionID;
    }
    public override int GetHashCode()
    {
        return this.PermissionID .GetHashCode();
    }
}

如果您无法更改此课程的实施,您还可以在IEqualityComparer中使用自己的Distinct实施:

var actualPermissions = permissions.Distinct(myEqualityComparer);

如果您只想查看该项目是否已全部添加,您只需检查Contains是否依赖Equals实施,如上所示:

AddDefaultPermissions(params Permission[] permissions) 
{
    var actualPermissions = permissions.Distinct();
    foreach(var p in permissions)
        if(!listOfAllreadyAddedPermissions.Contains(p)
            listOfAllreadyAddedPermissions.Add(p);
}

或者反过来 - 如果你不想改变课程 - 请使用Any

if(!listOfAllreadyAddedPermissions.Any(x => x.PermissionId == p.PermissionId)
    listOfAllreadyAddedPermissions.Add(p);