C# 泛型可以用来组合这些方法吗?

C# 泛型可以用来组合这些方法吗?,c#,generics,C#,Generics,我正在尝试根据文件输入设置比较(即两个值位于XML选项文件中并读入,我想比较它们) 我可以这样做,但它似乎有点冗长。我想我会把它贴在这里,看看是否有一种方法可以通过泛型完成比较 以下是我的方法: // Only equal is supported for strings. public static bool CompareString(this ComparisionOperator oper, string leftSide, string rightSide) { return

我正在尝试根据文件输入设置比较(即两个值位于XML选项文件中并读入,我想比较它们)

我可以这样做,但它似乎有点冗长。我想我会把它贴在这里,看看是否有一种方法可以通过泛型完成比较

以下是我的方法:

// Only equal is supported for strings.
public static bool CompareString(this ComparisionOperator oper, string leftSide, string rightSide)
{
    return leftSide == rightSide;
}


public static bool CompareDouble(this ComparisionOperator oper, double leftSide, double rightSide)
{
    switch (oper)
    {
        case ComparisionOperator.LessThan:
            return leftSide < rightSide;
        case ComparisionOperator.GreaterThan:
            return leftSide > rightSide;
        case ComparisionOperator.LessThanOrEqualTo:
            return leftSide <= rightSide;
        case ComparisionOperator.GreaterThanOrEqualTo:
            return leftSide >= rightSide;
        case ComparisionOperator.EqualTo:
            return leftSide == rightSide;
        default:
            throw new ArgumentOutOfRangeException("oper");
    }
}


public static bool CompareDateTime(this ComparisionOperator oper, DateTime leftSide, DateTime rightSide)
{
    switch (oper)
    {
        case ComparisionOperator.LessThan:
            return leftSide < rightSide;
        case ComparisionOperator.GreaterThan:
            return leftSide > rightSide;
        case ComparisionOperator.LessThanOrEqualTo:
            return leftSide <= rightSide;
        case ComparisionOperator.GreaterThanOrEqualTo:
            return leftSide >= rightSide;
        case ComparisionOperator.EqualTo:
            return leftSide == rightSide;
        default:
            throw new ArgumentOutOfRangeException("oper");
    }
}

//  Repeated for Int (and maybe GUID)
//字符串只支持equal。
公共静态布尔比较器字符串(此比较器运算符、字符串左侧、字符串右侧)
{
返回leftSide==右侧;
}
公共静态bool CompareDouble(此ComparisionOperator,双左侧,双右侧)
{
开关(操作)
{
案例比较Operator.LessThan:
返回左侧<右侧;
案例比较运算符。大于:
返回左侧>右侧;
案例比较Operator.LessThanOrEqualTo:
返回左侧=右侧;
案例比较Operator.EqualTo:
返回leftSide==右侧;
违约:
抛出新ArgumentOutOfRangeException(“oper”);
}
}
公共静态bool CompareDateTime(此比较运算符oper、DateTime leftSide、DateTime rightSide)
{
开关(操作)
{
案例比较Operator.LessThan:
返回左侧<右侧;
案例比较运算符。大于:
返回左侧>右侧;
案例比较Operator.LessThanOrEqualTo:
返回左侧=右侧;
案例比较Operator.EqualTo:
返回leftSide==右侧;
违约:
抛出新ArgumentOutOfRangeException(“oper”);
}
}
//对Int(可能还有GUID)重复
我只是重复这些会更好吗

我遇到的问题是比较字符串与比较数字或日期时间不同。如果我只是创建一个泛型方法并传入一个字符串,当它尝试对字符串执行小于时,它会感到困惑吗

如果它尝试在字符串上执行小于,它会感到困惑吗

由于没有为String类定义这些运算符,程序将崩溃。您可以接受一个IComparer来为您进行比较,该comparer可以定义一个字符串“小于”或“大于”另一个字符串的含义

如果它尝试在字符串上执行小于,它会感到困惑吗


由于没有为String类定义这些运算符,程序将崩溃。您可以接受一个IComparer来为您进行比较,该comparer可以定义一个字符串“小于”或“大于”另一个字符串的含义。

您可以使用泛型对某些类型进行重构,方法是限制实现的类型

public static bool Compare(此comparisonoper,T leftSide,T righside)
其中T:i可比较
{
开关(操作)
{
案例比较Operator.LessThan:
返回leftSide.CompareTo(righside)<0;
案例比较运算符。大于:
返回左侧。比较(右侧)>0;
案例比较Operator.LessThanOrEqualTo:
返回leftSide.CompareTo(righside)=0;
案例比较Operator.EqualTo:
返回leftSide.CompareTo(righside)==0;
违约:
抛出新ArgumentOutOfRangeException(“oper”);
}
}

这将适用于相当多的类型,如
Int32
Double
Single
,等等,所有这些类型都实现了
IComparable

您可以使用泛型对某些类型进行重构,方法是限制实现的类型

public static bool Compare(此comparisonoper,T leftSide,T righside)
其中T:i可比较
{
开关(操作)
{
案例比较Operator.LessThan:
返回leftSide.CompareTo(righside)<0;
案例比较运算符。大于:
返回左侧。比较(右侧)>0;
案例比较Operator.LessThanOrEqualTo:
返回leftSide.CompareTo(righside)=0;
案例比较Operator.EqualTo:
返回leftSide.CompareTo(righside)==0;
违约:
抛出新ArgumentOutOfRangeException(“oper”);
}
}
这将适用于许多类型,如
Int32
Double
Single
,等等,所有这些类型都实现了
IComparable

环视比较器.Default()环视比较器.Default()
public static bool Compare<T>(this ComparisionOperator oper, T leftSide, T rightSide)
    where T : IComparable<T>
{
    switch (oper)
    {
        case ComparisionOperator.LessThan:
            return leftSide.CompareTo(rightSide) < 0;
        case ComparisionOperator.GreaterThan:
            return leftSide.CompareTo(rightSide) > 0;
        case ComparisionOperator.LessThanOrEqualTo:
            return leftSide.CompareTo(rightSide) <= 0;
        case ComparisionOperator.GreaterThanOrEqualTo:
            return leftSide.CompareTo(rightSide) >= 0;
        case ComparisionOperator.EqualTo:
            return leftSide.CompareTo(rightSide) == 0;
        default:
            throw new ArgumentOutOfRangeException("oper");
    }
}