泛型方法约束
本文关键字:约束 泛型方法 | 更新日期: 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;
}
显然,你的FirstGridList
和SecondGridList
都应该实现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#文化的开发人员来说,似乎都是合理和可读的。当然,它为你节省了几行代码。请记住,你写的代码越多,出错的可能性就越大。