【问题标题】:Pass Many Classes To Method将许多类传递给方法
【发布时间】:2017-07-21 21:04:15
【问题描述】:

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

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

我想不通的是如何将多个权限传递给这个函数并检查是否已经添加了权限。我的想法是允许类似以下方法调用:

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 变量。此变量由所有权限类继承,并且对于权限是唯一的(编辑 = 1、创建 = 2、删除 = 3);

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

【问题讨论】:

  • 您能否提供一些您的结构的示例代码?至少对我来说,很难理解你的结构。特别是:EditDeleteCreate 是什么?那些是权限类的成员吗?还是从它派生的类?还是枚举成员?无论如何,要检查重复项,您只需致电 permissions.Distinct(x => x.TheMemberToBeUnique)
  • 如果您使用正确的枚举类型,您可以将编辑、删除和创建全部作为一个选项。编辑将是 1、删除 2、创建 4 等等。
  • @HimBromBeere 当然,我会在 2 分钟内用示例更新问题
  • 要允许该方法调用,请使用以下签名:“public void AddDefaultPermissions(params Permission[] permissions)”
  • AddDefaultPermissions 方法应该做什么?它应该检查permissions 数组中是否已经存在权限,还是应该只添加permissions 数组中的所有内容(我是根据你的方法签名public void AddDefaultPermissions(Permission[] permissions) 来问这个的)?

标签: c# linq class arguments


【解决方案1】:

您可以使用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 方法时,上述内容才有效。

【讨论】:

    【解决方案2】:

    您可以使用Distinct 轻松消除输入中的重复数据:

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

    这假设您的Permission-class 通过比较PermissionID-property 适当地实现EqualsGetHashCoe,例如:

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

    如果您无法更改此类的实现,您也可以在Distinct 中为IEqualityComparer 使用您自己的实现:

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

    【讨论】:

    • 谢谢。我添加了一些与代码相关的更改,但一切正常!
    猜你喜欢
    • 2011-01-01
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-10
    • 2011-01-26
    • 2015-09-25
    相关资源
    最近更新 更多