我有以下代码:
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的后代列表。
从概念上讲,我明白为什么会这样。但是,有解决方法吗?
答案 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;
}
}