Работаем с методом C# generi c и делаем его строго типизированным - PullRequest
1 голос
/ 28 мая 2020

У меня есть два типа профилей:

TeamPlayerPage.cs & TeamStaffMemberPage

В моем коде (который является решением Umbraco) я создал два метода, которые получают и создают набор профилей, например

GetPlayerProfiles(TeamPlayersLandingPage teamPlayersPage)
GetStaffProfiles(TeamStaffLandingPage staffMembersPage)

В каждом из вышеперечисленных методов я создаю SponsorListItem, чтобы связать спонсора с профилем. Пример ниже

private SponsorListItem GetPlayerSponsor(TeamPlayerPage teamPlayerPage)
{
    if (teamPlayerPage.Sponsor == null)
        return null;

    var sponsorPage = teamPlayerPage.Sponsor as SponsorPage;

    var sponsor = new SponsorListItem()
    {
        Heading = sponsorPage.Heading,
        Url = sponsorPage.Url,
        ListingImgUrl = sponsorPage.Image != null ? sponsorPage.GetCropUrl("image", "360x152(listing)") : Global.PlaceholderImage.GenericListingItem,
        KeySponsor = sponsorPage.KeySponsor
    };

    return sponsor;
}

Логи спонсора c точно такие же для каждого типа, поэтому я хотел бы создать один общий c метод, например GetProfileSponsor (T profilePage), а не два (см. Ниже) Цель состоит в том, чтобы иметь возможность передавать либо TeamPlayerPage, либо TeamStaffMemberPage в общий метод c и иметь его строго типизированный, чтобы я мог получить доступ к его свойствам.

private SponsorListItem GetPlayerSponsor(TeamPlayerPage teamPlayerPage)
private SponsorListItem GetStaffSponsor(TeamStaffMemberPage staffMembersPage)

Я создал следующее, но я не совсем уверен, как сделать параметр T profilePage строго типизированным по сравнению с тем, что передается (если это возможно)

enter image description here

Я немного искал, но изо всех сил пытался понять концепцию. Может ли кто-нибудь указать мне правильное направление?

Спасибо

Пол

1 Ответ

3 голосов
/ 28 мая 2020

Для этого оба ваших класса должны реализовать общий интерфейс, чтобы вы могли ограничить метод этим. Например:

public interface ISponsor
{
    SponsorPage Sponsor { get; }
}

А затем сделайте так, чтобы ваш класс реализовал этот интерфейс:

public class TeamPlayersLandingPage : ISponsor
{
}

Теперь вы можете ограничить свой метод generi c:

private SponsorListItem GetProfileSponsor<T>(T profilePage)
    where T : ISponsor
{
    var sponsor = profilePage.Sponsor;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...