2014-12-01 2 views
1

일반 인터페이스의 모든 변형을 목록에서 처리해야합니다.Linq에서 일반 인터페이스 유형으로 필터링하는 방법은 무엇입니까?

다음 예제에는 각각 에 대한 참조가있는 DerivedPerson이 있습니다. Main 방법에서

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

나는 어떤 템플릿뿐만 아니라 유형 PersonTemplate의 사람들의 모든 인스턴스를 처리 할. 나는 그것을 처리 할 수있는 일반적인 방법을 찾고있다.

비슷하고 이미 받아 들여진 질문 here을 발견했습니다. 하지만 내 목표는 필터링 IList<object>로하지만 계속 진행하지 않은 IList<ITemplate> 당신은이 작업을 수행 할 수 있습니다

+2

'ITemplateInstance는 '단순히 *'>을 ITemplateInstance되지 * '- 너는 한쪽에서 다른쪽으로 던져 넣을 수 없다. 만약'TemplateReference'가 읽기 전용이라면,'ITemplateReference '을 선언 할 수 있습니다. 이것이 효과가 있었으면 좋겠습니까? –

+1

OfType은 인스턴스 유형을 살펴보고이 유형으로 형변환 할 수있는 인스턴스 콜렉션을 리턴합니다. 인터페이스 (예 : ITemplateInstance )로 전송할 수 없습니다! – hatem87

+0

@ 존 이것이 바람직한 해결책이 될 것입니다. 그러나 내 코드는 여기서 공분산을 허용하기 위해 많은 리팩토링이 필요합니다. – mamuesstack

답변

3

: 음

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(); 
+0

무슨 뜻입니까? 그것은 그가 요구하는 것과 정확히 일치합니다. allTemplates' ... "행 – svinja

+0

내 나쁜 ... 질문의 맨 아래 부분을 보지 못했습니다. 죄송합니다. – BenjaminPaul

+0

괜찮습니다. :-) – svinja

관련 문제