需要帮助避免跨多个方法签名的代码重复

4 c# delegates code-duplication

我需要在我的应用程序中将某些数字限制为有效范围.我创建了代表来处理这个问题.我不知道这是否是正确的做法; 我遇到了一些错误的事情.

public delegate int RestrictInteger(int minimum, int maximum, int value);
public delegate decimal RestrictDecimal(decimal minumum, decimal maximum, decimal value);

class GameMath
{
    public static int RestrictNumber(int minimum, int maximum, int value)
    {
        if (value < minimum) { value = minimum; }
        else if (value > maximum) { value = maximum; }
        return value;
    }
    public static decimal RestrictNumber(decimal minimum, decimal maximum, decimal value)
    {
        if (value < minimum) { value = minimum; }
        else if (value > maximum) { value = maximum; }
        return value;
    }
}
public class SomeClass
{
    public int aValue { get; set; }

    public void SetValue(int value)
    {
        RestrictInteger doRestrict = new RestrictInteger(GameMath.RestrictNumber);
        this.aValue = doRestrict(0, 100, value);

    }
}
Run Code Online (Sandbox Code Playgroud)

一方面,似乎我添加了更多签名,然后我希望能够用它们做不同的事情(比如转换或舍入等).另一方面,在这两个签名之间,代码完全相同.这是否可以,或者是否有某种方法可以编写适用于这两种情况的操作,即使其他情况可能使用不同的操作?

Jon*_*eet 21

是的,你可以用泛型做到这一点 - 尽管不是<>.您应该使用这些类型IComparable<T>为自己实现的事实:

public static T RestrictNumber<T>(T min, T max, T value) where T : IComparable<T>
{
    return value.CompareTo(min) < 0 ? min
         : value.CompareTo(max) > 0 ? max
         : value;
}
Run Code Online (Sandbox Code Playgroud)

(你可以仍然使用原来的代码在这里-我比较喜欢这种使用,虽然条件运算符的;它满足我的成长功能的倾向.)