具有接口约束的通用扩展方法

时间:2013-05-18 13:44:39

标签: generics interface extension-methods

我已经制作了一个通用扩展方法(即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();

1 个答案:

答案 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();