将类型特定方法重写为泛型

时间:2009-12-30 15:13:44

标签: c# generics collections

我有一个方法(如下所示)我发现可以在其他地方的代码中重用,如果我可以把它变成一个通用的方法,但我正在努力学习语法并且可以使用一些帮助:

样品:

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;
        }

正如您所看到的,它是一个简单的方法,它接受一个I​​ndexEntry类型的列表,并枚举该列表添加对层次结构中父项的引用。我发现有类似的设计类型,也需要在各个点添加这种引用。我想修改这个代码以获取一个List并返回一个合适的List,其中T是传入的类型。这看起来像是一个直接的写法,但我想我可能在我的方法中缺少一个简单的sytax问题定义。谁能开导我?

提前致谢,

史蒂夫

2 个答案:

答案 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);
相关问题