簡體   English   中英

如何在Linq中過濾通用接口的類型?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM