如何实现采用基数 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;
}
我有以下代码:
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;
}