0

我已经制作了一个通用扩展方法(即 AsXml),但仍然希望在我的某些类上使用接口(IXmlable)进行约束。

一旦我介绍了我的约束,我的一些方法正在与我争论。

我的一种方法是返回 aList<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();
4

1 回答 1

1

你需要做类似的事情

return MyMethodThatReturnsAListOfPersons().Select(p => p.AsXml()).ToList();

假设MyMethodThatReturnsAListOfPersons返回 aList<Person>并且您想要创建一个List<string>包含 xml。

这是因为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();
于 2013-05-18T14:10:49.033 回答