c# - 如何在函数中使用任何类型?
问题描述
递归函数检查类层次结构成员的循环。它有效,但我想让它对程序中的所有类似对象通用。在这种情况下如何使用参数?
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;
}
解决方案
但我想让程序中所有类似的对象都通用
这要求类实际上是相似的。为此,我们引入了一个接口,其中包括类似的所有内容。让我们称之为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
。
推荐阅读
- javascript - 了解用于 Internet Explorer 5-8 的 JavaScript CSSStyleSheet.insertRule() 方法的 polyfill
- python - 对给定键的上部进行分区
- twitter-bootstrap - 我怎样才能使按钮的宽度相同
- database-design - 我应该在我的电子商务应用程序中有一个购物车表,还是只有一个未结订单状态?
- python - 如何在 CBV 调用之间保留 kwargs
- python - 验证消息是使用 Twilio 发送的 - Python
- sql - 在访问表中查找缺失的序列号
- arrays - 以任意顺序搜索 MongoDB 对象数组
- python-3.x - 如何将 Pytoch 数据集克隆到另一个变量中?
- laravel - 如何在 Laravel 应用程序中添加回复?