使用interface转换具有扩展名和lambdas的对象集合

时间:2010-10-13 16:09:38

标签: c#-4.0 lambda extension-methods generics

我有一些对象,如用户,地址等,我使用扩展方法将它们转换为业务对象:

public static UserModel ToPresentationForm(this User pUser)
    {
        return new UserModel
        {
          ...
          map data
          ...
        };
    }

此外,我需要转换强类型集合,通常我有以下代码:

public static List<UserModel> ToPresentationForm(this List<User> pUserColl)
    {
        return pUserColl.Select(x => x.ToPresentationForm()).ToList();
    }

我在想,如果我添加一些接口,比如IPresentationForms并且能够使用它,可以编写像

这样的方法
public static List<T> ToPresentationForm(this List<IPresentationForms> pTemplate)
    {
        return pUserColl.Select(x => x.ToPresentationForm()).ToList();
    }

不确定如何为方法类型提供参数以使其通用。所以实际的问题是,如何做到这一点。

P.S。我正在使用C#4.0

1 个答案:

答案 0 :(得分:1)

不幸的是,由于UserUserModel之间可能没有任何关系,因此无法创建一个界面来执行您想要的操作。

另一方面,假设UserUserModel都实现了IUser接口。然后你可以有这样的界面:

interface IPresentationForms<T>
{
    T ToPresentationForm();
}

您可以像这样定义User

class User: IUser, IPresentationForms<IUser>
{
    public IUser ToPresentationForm()
    {
        return new UserModel(...);
    }
    .... // implement IUser
}

这可以让您定义ToPresentationForm这样的内容:

public static List<T> ToPresentationForm<T>(this IEnumerable<T> pTemplate)
    where T : IPresentationForms<T>
{    
    return pTemplate.Select(x => x.ToPresentationForm()).ToList();    
}    

要避免一些额外的方法,还有很多工作要做。