2013-05-18 3 views
0

일반 확장 메서드 (예 : AsXml)를 만들었지 만 일부 클래스에서 인터페이스 (IXmlable)를 사용하여 제약 조건을 유지하려고합니다.인터페이스 제한이있는 일반 확장 메서드

제약 조건을 도입하자마자 일부 방법이 저와 논쟁 중입니다. 내 방법

하나는 List<Interest>을 returing하고 컴파일러는 말한다 :

유형 'System.Collections.Generic.List'가 제네릭 형식이나 방법 '을 MyWebApp의 형식 매개 변수'T '로 사용할 수 없습니다. Entities.Extension.AsXml (T) '. 'System.Collections.Generic.List'에서 'MyWebApp.Interfaces.IXmlable'로의 암시적인 참조 변환은 없습니다.

public class Person : IXmlable 
{ 
    public string Name { get; set; } 
    public List<Interest> Interests { get; set; } // My Interest class also implements IXmlable 
} 

내 확장 방법은 다음과 같습니다 :

내 클래스입니다

public static class Extension 
    { 
     public static string AsXml<T>(this T entity) where T : IXmlable 
     { 
      return MakeItXml(entity); 
     } 
    } 

이 내 방법

return MyMethodThatReturnsAListOfPersons().AsXml(); 
+0

어떤 언어를? – mate64

답변

1

당신은

같은 것을 할 필요가
return MyMethodThatReturnsAListOfPersons().Select(p => p.AsXml()).ToList(); 

으로 가정하면 MyMethodThatReturnsAListOfPersonsList<Person>을 반환하고 xml을 포함하는 List<string>을 생성하려고합니다.

List<T>IXmlable 인터페이스를 구현하지 않기 때문에 목록의 각 Person 요소를 통해 수동으로 투영해야합니다.

당신이해야 할 경우이 다른 확장 메서드를 만들 수 많은 :

public static List<string> AsXmlList<T>(this IEnumerable<T> seq) where T : IXmlable 
{ 
    return seq.Select(i => i.AsXml()).ToList(); 
} 

그래서 코드는 다음과 같다 :

return MyMethodThatReturnsAListOfPersons().AsXmlList(); 
+0

또는 ... 그는'IEnumerable '에서 작동하는 또 다른 확장 메서드를 추가 할 수 있습니다. 여기서'T'는'IXmlable'입니다. –

+0

@ LasseV.Karlsen 예를 들려 줄 수 있습니다. 차라리 linq 매핑의 다른 수준을 소개하지 않을 것입니다. – codingjoe

+0

아, 새로운 확장 방법으로 업데이트 된 소식을 볼 수 있습니다. 시도해 보겠습니다. :) – codingjoe

관련 문제