如何在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);
与任何此类事情一样,添加更多选项时总是会拖累需要更改多少;为了我的钱,我只会使用枚举并相信开发人员不会在
中添加疯狂的值
有没有办法只允许某些值作为方法中的参数。不是在运行时,我的意思是它在编码时已经显示错误。例如:
我有这个方法:
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);
与任何此类事情一样,添加更多选项时总是会拖累需要更改多少;为了我的钱,我只会使用枚举并相信开发人员不会在
中添加疯狂的值