如何实现采用基数 class 的后代的扩展方法?

How can implement an extension method that takes descendants of the base class?

我有以下代码:

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 的后代列表。

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

我建议使用通用类型参数并将其约束到您的 MsgContract class,如下所示:

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

List<T> 不是协变投影,因此建议使用 IEnumerable<T> 类型参数是协变的。

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

     return entry;
  }