일반 인터페이스의 모든 변형을 목록에서 처리해야합니다.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>
당신은이 작업을 수행 할 수 있습니다
'ITemplateInstance는'단순히 *'>을 ITemplateInstance되지 * '- 너는 한쪽에서 다른쪽으로 던져 넣을 수 없다. 만약'TemplateReference'가 읽기 전용이라면,'ITemplateReference '을 선언 할 수 있습니다. 이것이 효과가 있었으면 좋겠습니까? –
OfType은 인스턴스 유형을 살펴보고이 유형으로 형변환 할 수있는 인스턴스 콜렉션을 리턴합니다. 인터페이스 (예 : ITemplateInstance)로 전송할 수 없습니다! –
hatem87
@ 존 이것이 바람직한 해결책이 될 것입니다. 그러나 내 코드는 여기서 공분산을 허용하기 위해 많은 리팩토링이 필요합니다. – mamuesstack