我有一个方法(如下所示)我发现可以在其他地方的代码中重用,如果我可以把它变成一个通用的方法,但我正在努力学习语法并且可以使用一些帮助:
样品:
private List<IndexEntry> AddParentReferences(List<IndexEntry> listWithoutParents)
{
List<IndexEntry> listWithParents = new List<IndexEntry>();
foreach (IndexEntry currentEntry in listWithoutParents)
{
if (currentEntry.SubEntries == null || currentEntry.SubEntries.Count < 1)
{
listWithParents.Add(currentEntry);
continue;
}
AddIndividualParentReference(currentEntry);
listWithParents.Add(currentEntry);
}
return listWithParents;
}
正如您所看到的,它是一个简单的方法,它接受一个IndexEntry类型的列表,并枚举该列表添加对层次结构中父项的引用。我发现有类似的设计类型,也需要在各个点添加这种引用。我想修改这个代码以获取一个List并返回一个合适的List,其中T是传入的类型。这看起来像是一个直接的写法,但我想我可能在我的方法中缺少一个简单的sytax问题定义。谁能开导我?
提前致谢,
史蒂夫
答案 0 :(得分:5)
当您使方法通用时,您需要添加类型约束。如果不这样做,则无法访问currentEntry.SubEntries
,因为编译器无法推断出T
具有此类属性。因此,定义一个接口类型,如下所示,然后继续:
List<T> AddParentReferences<T>(List<T> listWithoutParents) where T : IIndexEntry {
List<T> listWithParents = new List<T>();
foreach (T currentEntry in listWithoutParents) {
if (currentEntry.SubEntries == null || currentEntry.SubEntries.Count < 1) {
listWithParents.Add(currentEntry);
continue;
}
AddIndividualParentReference(currentEntry);
listWithParents.Add(currentEntry);
}
return listWithParents;
}
以下是完成上述工作所需的最小界面:
interface IIndexEntry {
IList<IIndexEntry> SubEntries;
}
答案 1 :(得分:3)
您可以通过将<T>
附加到方法名称来使方法具有通用性。
问题是您需要T
属性SubEntries
。您可以通过将T
限制为实现接口的类型(请参阅@ jason的答案),或通过传入一个判断条目是否为空的谓词来解决此问题:
private List<T> AddParentReferences<T>(
List<T> listWithoutParents,
Func<T, bool> isEmpty)
{
List<T> listWithParents = new List<T>();
foreach (T currentEntry in listWithoutParents)
{
if (isEmpty(currentEntry))
{
listWithParents.Add(currentEntry);
continue;
}
AddIndividualParentReference(currentEntry);
listWithParents.Add(currentEntry);
}
return listWithParents;
}
用法:
AddParentReferences<IndexEntry>(
indexEntries,
e => e.SubEntries == null || e.SubEntries.Count < 1);