C# 4.0 使用接口转换具有扩展名和lambda的对象集合

C# 4.0 使用接口转换具有扩展名和lambda的对象集合,c#-4.0,lambda,extension-methods,generics,C# 4.0,Lambda,Extension Methods,Generics,我有一些对象,如用户、地址等,我正在使用扩展方法将它们转换为业务对象: public static UserModel ToPresentationForm(this User pUser) { return new UserModel { ... map data ... }; } 此外,我还需要转换强类型集合,通常我有以下代码: public static List&

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

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.Im使用C4.0

不幸的是,由于用户和用户模型之间可能没有关系,因此无法创建一个界面来实现您想要的功能

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

interface IPresentationForms<T>
{
    T ToPresentationForm();
}
class User: IUser, IPresentationForms<IUser>
{
    public IUser ToPresentationForm()
    {
        return new UserModel(...);
    }
    .... // implement IUser
}
public static List<T> ToPresentationForm<T>(this IEnumerable<T> pTemplate)
    where T : IPresentationForms<T>
{    
    return pTemplate.Select(x => x.ToPresentationForm()).ToList();    
}    
这可以让您定义ToPresentationForm,如下所示:

interface IPresentationForms<T>
{
    T ToPresentationForm();
}
class User: IUser, IPresentationForms<IUser>
{
    public IUser ToPresentationForm()
    {
        return new UserModel(...);
    }
    .... // implement IUser
}
public static List<T> ToPresentationForm<T>(this IEnumerable<T> pTemplate)
    where T : IPresentationForms<T>
{    
    return pTemplate.Select(x => x.ToPresentationForm()).ToList();    
}    

要避免使用一些额外的方法,需要做大量的工作。

两个类之间没有接口是什么意思?因为你对UserModel的定义可能没有提到任何地方的用户,所以你不能做你想做的事情。例如,如果UserModel实现了IModel,也许您可以创建您的接口。好的,应该实现什么和以使其使用一个方法转换所有集合?:-。我不介意稍微改变一下,只是我认为它现在的工作方式不如我做复制粘贴,只是为了指定类型。我不认为这里有一个简单的解决方法。如果你发布User和UserModel的声明,也许我们可以看看这是否可行,但很可能不是。实际上,这是两个具有相同属性列表的类。例如,让它成为FirstName和LastName。在上一个示例中,您有。Selectx=>x.ToPresentationForm。您希望调用什么。ToPresentationForm?您是否希望发生动态事件,从而调用为给定具体类型创建的正确extentsion方法?事实上,是的,从示例中您可以看到,实际上我转换集合所做的只是复制粘贴相同的代码,只是指定类型。所以我想也许有一种方法可以用另一种方式来指定类型。那么T是什么呢?为什么这个方法名为ToPresentationForm,但它需要一个ipPresentationForm的列表——这似乎毫无意义。Kirk,这不是一个可以工作的代码。我刚刚发布了它是如何用2种方法完成的。每种新类型都需要两种方法,其中一种几乎适用于所有类型。所以问题是如何使它通用。我的代码示例是一段不起作用的代码,我只是把它放在这里,以显示我希望最后有一个方法来转换所有类型的集合