我已经制作了一个通用扩展方法(即AsXml),但仍希望在我的某些类上使用接口(IXmlable)进行约束。
一旦我介绍了我的约束,我的一些方法就和我争论。
我的一个方法是退回List<Interest>
,编译器说:
类型'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
}
我的扩展方法如下所示:
public static class Extension
{
public static string AsXml<T>(this T entity) where T : IXmlable
{
return MakeItXml(entity);
}
}
这是我的方法:
return MyMethodThatReturnsAListOfPersons().AsXml();
答案 0 :(得分:1)
您需要执行类似
的操作return MyMethodThatReturnsAListOfPersons().Select(p => p.AsXml()).ToList();
假设MyMethodThatReturnsAListOfPersons
返回List<Person>
,并且您想创建一个包含xml的List<string>
。
这是因为List<T>
未实现您的IXmlable
界面,因此您必须手动对列表中的每个Person
元素进行投影。
如果你需要做很多事情,你可以创建另一种扩展方法:
public static List<string> AsXmlList<T>(this IEnumerable<T> seq) where T : IXmlable
{
return seq.Select(i => i.AsXml()).ToList();
}
所以你的代码就是:
return MyMethodThatReturnsAListOfPersons().AsXmlList();