如何实现一个接受基类后代的扩展方法?

时间:2015-01-22 05:14:25

标签: c# inheritance extension-methods

我有以下代码:

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
}

似乎扩展方法只接受List但不接受MsgContract的后代列表。

从概念上讲,我明白为什么会这样。但是,有解决方法吗?

2 个答案:

答案 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;
  }

答案 1 :(得分: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;
  }
}