首页 > 解决方案 > 如何在函数中使用任何类型?

问题描述

递归函数检查类层次结构成员的循环。它有效,但我想让它对程序中的所有类似对象通用。在这种情况下如何使用参数?

private bool CheckReferenceLoop(Organization Object, List<Organization> OrganizationsStack, Data.DataContext db)
    {
        bool HaveLoop = false;
        if (OrganizationsStack.Find(a => a.Id == Object.Id) != null)
        {
            HaveLoop = true;
        }
        else
        {
            OrganizationsStack.Add(Object);
            Object.GetChildItems(db);
            Object.ChildItems.ForEach(delegate (Organization ChildItem)
            {
                if (!HaveLoop)
                {
                    HaveLoop = CheckReferenceLoop(ChildItem, OrganizationsStack, db);
                }
            });
        }
        return HaveLoop;
    }

标签: c#.netfunction

解决方案


但我想让程序中所有类似的对象都通用

这要求类实际上是相似的。为此,我们引入了一个接口,其中包括类似的所有内容。让我们称之为ICanHaveReferenceLoop。实现可能如下所示:

public interface ICanHaveReferenceLoop
{
    int Id { get; }
    void GetChildItems(Data.DataContext db);
    IEnumerable<ICanHaveReferenceLoop> ChildItems { get; }
}

确保Organization你的其他类实现了这个接口。

public class Organization : ICanHaveReferenceLoop
{
    //... your code.
}

然后像这样改变你的方法:

private bool CheckReferenceLoop<T>(T Object, List<T> OrganizationsStack, Data.DataContext db) where T : ICanHaveReferenceLoop
    {
        bool HaveLoop = false;
        if (OrganizationsStack.Find(a => a.Id == Object.Id) != null)
        {
            HaveLoop = true;
        }
        else
        {
            OrganizationsStack.Add(Object);
            Object.GetChildItems(db);
            Object.ChildItems.ForEach(delegate (T ChildItem)
            {
                if (!HaveLoop)
                {
                    HaveLoop = CheckReferenceLoop(ChildItem, OrganizationsStack, db);
                }
            });
        }
        return HaveLoop;
    }

请注意,where T在签名的末尾是必需的,否则您将无法使用Object.GetChildItems(db);or Object.ChildItems.ForEach


推荐阅读