Generics 带有接口约束的泛型扩展方法

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

我已经创建了一个通用扩展方法(即AsXml),但仍然希望在我的一些类上有一个带有接口(IXmlable)的约束

一旦我引入了约束,我的一些方法就会与我争论

我的一个方法是返回
列表
,编译器说:

类型“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();