【问题标题】:Use interface to convert collection of objects with extensions and lambdas使用接口转换具有扩展和 lambda 的对象集合
【发布时间】:2010-10-13 16:09:38
【问题描述】:

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

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();
    }

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

附:我使用 C# 4.0

【问题讨论】:

  • 在你的最后一个例子中,你有.Select(x =&gt; x.ToPresentationForm())。你期望.ToPresentationForm 调用什么?您是否期望发生一些动态的事情,以便它调用您为给定的具体类型所做的正确扩展方法?
  • 实际上是的,从示例中您可以看到,实际上我转换集合所做的只是复制粘贴相同的代码,只需指定类型。所以我想也许有办法以其他方式指定类型。
  • 什么是T?为什么方法名为ToPresentationForm 但它需要一个IPresentationForm 的列表——这似乎没有意义。
  • 柯克,its not a code that will work. I just posted how its 现在用 2 种方法完成了。每个新类型都需要 2 种方法,其中一种对所有类型几乎相同。所以问题是如何使它通用。我的代码示例是一段无法正常工作的代码,我只是把它放在最后展示我想要的东西(一种方法可以转换所有类型的集合)

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


【解决方案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();    
}    

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

【讨论】:

  • 两个类之间没有接口是什么意思?
  • 由于您对UserModel 的定义可能在任何地方都没有提及User,因此您无法为所欲为。如果UserModel 实现了IModel&lt;User&gt;(例如),也许你可以制作你的界面。
  • 好的,应该实施什么以使其使用一种方法转换所有集合? :-)。我不t mind to vary things a little bit, just I think as how it works now its 不好,因为我正在复制粘贴,只是为了指定类型。
  • 我不认为这里有一个简单的解决方法。如果您发布 UserUserModel 的声明,也许我们可以看看这是否可行,但很可能不是。
  • 实际上它是 2 个具有相同属性列表的类。例如,让它成为 FirstName 和 LastName。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-09
  • 1970-01-01
  • 2011-07-08
  • 1970-01-01
  • 1970-01-01
  • 2018-12-12
  • 1970-01-01
相关资源
最近更新 更多