我创建一个显式转换运营商的实体类型的泛型列表之间进行转换,以模型类型的泛型列表。 有谁知道为什么我收到以下错误:
用户定义的转换必须转换或从封闭类型
我已经有Entity.objA和Model.objA之间的显式转换运算符,它工作正常。 尝试转换的泛型列表时,问题出现了。 这甚至可能吗?
这里是我的代码:
public static explicit operator List<Model.objA>(List<Entity.objA> entities)
{
List<Model.objA> objs= new List<Model.objA>();
foreach (Entity.objA entity in entities)
{
objs.Add((Model.objA)entity);
}
return claims;
}
谢谢你的帮助。
错误“用户定义的转换必须转换或从封闭型说:”究竟是什么意思。 如果你有一个转换操作符
class MyClass {
public static explicit operator xxx(string s) { // details }
public static implicit operator string(xxx x) { // details }
}
然后xxx
必须是MyClass
。 这就是由意味着“转换必须转换或从封闭类型。” 这里的封闭类型是MyClass
。
在ECMA334 C#规范的相关章节17.9.4:
转换算子从源类型,由参数类型的转换运算符的,到目标类型,由转换运算符的返回类型指示指示转换。 类或结构允许声明从源类型S转换到目标类型T仅当以下所有条件都为真,其中S0和T0是从删除尾部产生的类型? 改性剂,如果有的话,选自S和T:
S0和T0是不同的类型。
要么S0或T0是在其中操作者声明发生在类或结构类型。
既不S0也不T0是一个接口类型。
排除用户定义的转换,转换不存在从S到T或从T到S.
因此,这里是你的代码:
public static explicit operator List<Model.objA>(List<Entity.objA> entities) {
List<Model.objA> objs= new List<Model.objA>();
foreach (Entity.objA entity in entities) {
objs.Add((Model.objA)entity);
}
return claims;
}
问题是,这被定义为一个转换操作符必须驻留在List<Model.objA>
或List<Entity.objA>
类,但当然,你不能这样做,因为你没有权限更改这些类型。
你可以使用Enumerable.Select
项目的其他类型或List<T>.ConvertAll
。 例如:
public static class ListExtensions {
public static List<Model.objA> ConvertToModel(this List<Entity.objA> entities) {
return entities.ConvertAll(e => (Model.objA)e);
}
}
基本上,你不能做到这一点。 在您的运营商输入或输出类型必须声明运营商的类型。 一种选择可能是一个扩展方法,但说实话LINQ Select
自带本身非常接近,一样List<T>.ConvertAll
。
作为扩展方法方法的一个例子:
public static class MyListUtils {
public static List<Model.objA> ToModel(this List<Entity.objA> entities)
{
return entities.ConvertAll(entity => (Model.objA)entity);
}
}
或者更一般地与LINQ Select
:
public static class MyListUtils {
public static IEnumerable<Model.objA> ToModel(
this IEnumerable<Entity.objA> entities)
{
return entities.Select(entity => (Model.objA)entity);
}
}
而只使用someList.ToModel()