[英]How to filter with types of generic interfaces in Linq?
我需要在列表中處理通用接口的所有變體。
在下面的示例中,每個DerivedPerson
都擁有對其PersonTemplate
的引用。
internal interface ITemplate
{
int TemplateID { get; set; }
}
internal class PersonTemplate : ITemplate
{
public PersonTemplate(int templateId)
{
TemplateID = templateId;
}
public int TemplateID { get; set; }
}
internal interface ITemplateInstance<TTemplate> where TTemplate : ITemplate
{
TTemplate TemplateReference { get; set; }
}
internal class DerivedPerson : ITemplateInstance<PersonTemplate>
{
public DerivedPerson(PersonTemplate template)
{
TemplateReference = template;
}
public PersonTemplate TemplateReference { get; set; }
}
internal class Program
{
private static void Main(string[] args)
{
IList<object> objects = new List<object>
{
new object(),
new DerivedPerson(new PersonTemplate(1)),
new DerivedPerson(new PersonTemplate(2))
};
//Count = 2
List<ITemplate> personTemplates = objects
.OfType<ITemplateInstance<PersonTemplate>>()
.Select(pi => pi.TemplateReference as ITemplate)
.ToList();
//Count = 0 (!)
List<ITemplate> allTemplates = objects
.OfType<ITemplateInstance<ITemplate>>()
.Select(pi => pi.TemplateReference)
.ToList();
}
}
在Main
方法中,我想處理任何模板的所有實例,而不僅僅是PersonTemplate
類型的PersonTemplate
。 我正在尋找可以處理該問題的通用方法。
我在這里發現了一個類似且已經被接受的問題。 但是我的目標不是繼續進行過濾的IList<object>
而是繼續進行IList<ITemplate>
您可以執行以下操作:
List<ITemplate> allTemplates
= objects.Where(o => o.GetType()
.GetInterfaces()
.Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(ITemplateInstance<>)))
.Select(o => o.GetType()
.GetProperty("TemplateReference")
.GetValue(o))
.OfType<ITemplate>()
.ToList();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.