2015-01-22 4 views
0

나는 다음과 같은 코드를 가지고 :기본 클래스의 하위 클래스를 사용하는 확장 메서드를 구현하는 방법은 무엇입니까?

public class MsgContract { 
    public virtual string ToJson() { 
     return genJson(); 
    } 
} 

public class A: MsgConract { 
    ... 
} 

public class B: MsgConract { 
    ... 
} 

public class ExtentionMethods { 
    public static string ToJson(this List<MsgContract> lst) { 
    foreach (var item in lst) 
     string entry += item.ToJson(); 

    return entry; 
    } 
} 

void Main() { 
    List<A> lst = new List<A>(); 
    lst.ToJson(); // error 
} 

이 확장 메서드는 목록을 허용하지만 것 같다되지 MsgContract의 후손의 목록을 표시합니다.

왜 이런지 이해합니다. 그러나 해결 방법이 있습니까?

답변

2

나는 다음과 같이 제네릭 형식 매개 변수를 사용하여 MsgContract 클래스에 제약 권하고 싶습니다 :

public class ExtentionMethods { 
    public static string ToJson<TContract>(this List<TContract> lst) 
     where TContract : MsgContract 
    { 
    foreach (var item in lst) 
     string entry += item.ToJson(); 

    return entry; 
    } 
} 
+0

감사합니다. 정확히 내가 찾던 ... 뇌 전문의가 있었어. – AngryHacker

+0

네, 걱정할 필요가 없습니다. 나 거기 가봤 어. –

3

List<T>는 형식 매개 변수는 공변 인 공변 투사, 그래서 권장 사용 IEnumerable<T> 없습니다.

public static string ToJson(this IEnumerable<MsgContract> lst) { 
    foreach (var item in lst) 
     string entry += item.ToJson(); 

    return entry; 
    } 
관련 문제