Используйте интерфейс для преобразования коллекции объектов с расширениями и лямбдами - PullRequest
0 голосов
/ 13 октября 2010

У меня есть некоторые объекты, такие как пользователь, адрес и т. Д., И я преобразую их в бизнес-объекты с помощью методов расширения:

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 Ответ

1 голос
/ 13 октября 2010

К сожалению, поскольку между User и UserModel, вероятно, нет никакой связи, нет способа создать интерфейс, который бы делал то, что вы хотите.

С другой стороны, скажем, что Userи UserModel оба реализуют интерфейс 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();    
}    

Это много работы, чтобы избежать нескольких дополнительных методов.

...