Generics 带有接口约束的泛型扩展方法
我已经创建了一个通用扩展方法(即AsXml),但仍然希望在我的一些类上有一个带有接口(IXmlable)的约束 一旦我引入了约束,我的一些方法就会与我争论 我的一个方法是返回Generics 带有接口约束的泛型扩展方法,generics,interface,extension-methods,Generics,Interface,Extension Methods,我已经创建了一个通用扩展方法(即AsXml),但仍然希望在我的一些类上有一个带有接口(IXmlable)的约束 一旦我引入了约束,我的一些方法就会与我争论 我的一个方法是返回列表,编译器说: 类型“System.Collections.Generic.List”不能用作泛型类型或方法“MyWebApp.Entities.Extension.AsXml(T)”中的类型参数“T”。没有从“System.Collections.Generic.List”到“MyWebApp.Interfaces.IX
列表
,编译器说:
类型“System.Collections.Generic.List”不能用作泛型类型或方法“MyWebApp.Entities.Extension.AsXml(T)”中的类型参数“T”。没有从“System.Collections.Generic.List”到“MyWebApp.Interfaces.IXmlable”的隐式引用转换
这是我的班级:
public class Person : IXmlable
{
public string Name { get; set; }
public List<Interest> Interests { get; set; } // My Interest class also implements IXmlable
}
你需要像这样做
return MyMethodThatReturnsAListOfPersons().Select(p => p.AsXml()).ToList();
假设mymethodthattreturnsalistofpersons
返回一个列表
,您希望创建一个包含xml的列表
这是因为List
没有实现您的IXmlable
界面,因此您必须手动对列表中的每个Person
元素进行投影
如果需要经常这样做,可以创建另一个扩展方法:
public static List<string> AsXmlList<T>(this IEnumerable<T> seq) where T : IXmlable
{
return seq.Select(i => i.AsXml()).ToList();
}
或他可以添加另一个扩展方法,在IEnumerable
上运行,T
是IXmlable
@LasseV.Karlsen您能举个例子吗。我不想介绍另一个级别的linq映射。啊,我看到了你用新的扩展方法更新的帖子……让我试试。:)我的MyMethodThatReturnsSalistofPersons方法将如何调用新的扩展方法?@Lee是的,我这样做了……但有些东西不起作用。这是因为我想返回的不是一个列表,而是一个序列化的字符串……让我试着做点什么。
return MyMethodThatReturnsAListOfPersons().Select(p => p.AsXml()).ToList();
public static List<string> AsXmlList<T>(this IEnumerable<T> seq) where T : IXmlable
{
return seq.Select(i => i.AsXml()).ToList();
}
return MyMethodThatReturnsAListOfPersons().AsXmlList();