如何在c#中的方法中只允许某些参数

How to allow only certain parameters in method in c#

有没有办法只允许某些值作为方法中的参数。不是在运行时,我的意思是它在编码时已经显示错误。例如:

我有这个方法:

public bool addPoints(Guid userId, uint amount)
{
    ...
}

在代码中会被多次调用。但是,我只希望人们传递某些价值观。这些值在某处定义 e.q。一个 class:

public class LeaderboardPoints
{
    public const uint CREATE = 30;
    public const uint REPLICATE = 15;
    public const uint REMIX = 15;
    public const uint COMMENT = 15;
}

有没有办法可以强制参数成为这些道具之一?或者是否有其他方法可以确保通过正确的数量?

谢谢!!

正如其他人评论的那样,您可以为此定义和使用 enum 类型:

public enum LeaderBoardAction : uint
{
    CREATE = 30,
    REPLICATE = 15,
    REMIX = 15,
    COMMENT = 15
}

然后使用Enum.IsDefined()确保没有人传递任意值来代替定义的枚举标签:

public bool AddPoints(Guid userId, LeaderBoardAction action)
{
    if(!Enum.IsDefined(typeof(LeaderBoardAction), action))
        throw new ArgumentException("Expected a valid leader board action", nameof(action));

    // ...
}

一个 enum 是一个选项,但枚举只是命名的整数 - 你 可以 弄错它们并传递任何整数(这更尴尬)。

另一种使传递错误更难的方法是将值封装在一个类型中,使用non-public构造函数使其不可能(没有至少反射)来创建无效的选项。例如:

public bool AddPoints(Guid userId, Points points)
{
    // something += points.Value
}
//...
public readonly struct Points
{
    public uint Value {get;}
    private Points(uint value) => Value = value;

    public static Points Create {get;} = new Points(30);
    public static Points Replicate {get;} = new Points(15);
    public static Points Remix {get;} = new Points(15);
    public static Points Comment {get;} = new Points(15);
}
// ...
something.AddPoints(userId, Points.Create);

如果有助于调试,您也可以选择给事物命名。

or is there maybe another way to make sure that the right amount is passed?

另一种方法是去掉参数,取而代之的是给他们可以调用的命名方法;你只有 4 个选项,所以它肯定是可行的:

private bool AddPoints(Guid userId, uint amount)
{
    ...
}

public bool AddCreatePoints(Guid userId) => AddPoints(userId, LeaderboardPoints.CREATE);
public bool AddReplicatePoints(Guid userId) => AddPoints(userId, LeaderboardPoints.REPLICATE);
public bool AddRemixPoints(Guid userId) => AddPoints(userId, LeaderboardPoints.REMIX);
public bool AddCommentPoints(Guid userId) => AddPoints(userId, LeaderboardPoints.COMMENT);

与任何此类事情一样,添加更多选项时总是会拖累需要更改多少;为了我的钱,我只会使用枚举并相信开发人员不会在

中添加疯狂的值