泛型方法约束

本文关键字:约束 泛型方法 | 更新日期: 2023-09-27 17:51:12

我有两个类,其中包含将填充单独的网格的数据。网格非常相似,但又不同到需要使用两个类。这两个网格都包含一个名为"getduplates"的函数,在我实现这些类的地方,我有一个方法来检查类是否有重复项并返回一条消息。

private bool HasDuplicates(FirstGridList firstList)
{
    var duplicates = firstList.FindDuplicates();
    if (duplicates.Count > 0)
    {
        // Do Something
        return true;
    }
    return false;
}

我希望能够使用FirstGridList和SecondGridList调用该方法。我只是不知道如何正确地实现泛型约束,然后将泛型输入参数转换为正确的类型。类似于:

private bool HasDuplicates<T>(T gridList)
{
    // Somehow cast the gridList to the specific type
    // either FirstGridList or SecondGridList
    // Both FirstGridList and SecondGridList have a method FindDuplicates
    // that both return a List<string>
    var duplicates = gridList.FindDuplicates();
    if (duplicates.Count > 0)
    {
        // Do Something
        return true;
    }
    return false;
}
如您所见,该方法做了同样的事情。因此,我不想创建这个两次。我觉得这是可能的,但我想错了。我对泛型还不是很有经验。谢谢你。

泛型方法约束

您可以让您的两个网格实现一个公共接口,如:

public interface IGridList
{
    public IList<string> FindDuplicates();
}

,然后根据这个接口定义你的通用约束:

private bool HasDuplicates<T>(T gridList) where T: IGridList
{
    // Both FirstGridList and SecondGridList have a method FindDuplicates
    // that both return a List<string>
    var duplicates = gridList.FindDuplicates();
    if (duplicates.Count > 0)
    {
        // Do Something
        return true;
    }
    return false;
}

显然,你的FirstGridListSecondGridList都应该实现IGridList接口和FindDuplicates方法。

或者你甚至可以在这个阶段去掉泛型:

private bool HasDuplicates(IGridList gridList)
{
    // Both FirstGridList and SecondGridList have a method FindDuplicates
    // that both return a List<string>
    var duplicates = gridList.FindDuplicates();
    if (duplicates.Count > 0)
    {
        // Do Something
        return true;
    }
    return false;
}
顺便说一下,在这个阶段,你甚至可以摆脱HasDuplicates方法,因为它不会给你的应用程序带来太多价值。我的意思是,面向对象编程早在泛型或LINQ之前就存在了,所以为什么不使用它呢?
IGridList gridList = ... get whatever implementation you like
bool hasDuplicates = gridList.FindDuplicates().Count > 0;
对于任何具有基本c#文化的开发人员来说,

似乎都是合理和可读的。当然,它为你节省了几行代码。请记住,你写的代码越多,出错的可能性就越大。