首页 > 解决方案 > 具有动态更改类的事件回调?

问题描述

我有一些情况,当我有一些带有类的列表时,例如这样List<Crews>List<CrewsOnLeave>,并且我制作了一些组件,我将在那里使用逻辑并只发送这两个中的一个(CrewsOnLeave 或 Crews),所以我不需要在组件中声明我的类,因为这是我的代码

我现在的代码

    @using Models.BookingCrew

    @if (CrewonLeave.Count() > 0)
    {
    <td @onclick="SearchCrews">
        <span style="cursor: pointer;" data-toggle="modal"
            data-target="#@(modalId)">
            @CrewonLeave.Count()</span>
    </td>
    }
    else if(Crews.Count()> 0 )
    {
        <td @onclick="SearchOnLeave">
        <span style="cursor: pointer;" data-toggle="modal"
            data-target="#@(modalId)">
            @Crews.Count()</span>
    </td>
    }
    else
    {
    <td> </td>
    }

    @code{

        [Parameter]
        public string modalId{get;set;}

        [Parameter]
        public List<Crew> Crews{get; set;}
        [Parameter]
        public List<CrewOnLeave> CrewonLeave{get;set;}
        [Parameter]
        public EventCallback<List<CrewOnLeave>> OnLeaveClicked {get; set;}
        [Parameter]
        public EventCallback<List<Crew>> OnCrewsClicked {get; set;}
        private Task SearchCrews()
        {
            return OnCrewsClicked.InvokeAsync(Crews);
        }
        private Task SearchOnLeave()
        {
            return OnLeaveClicked.InvokeAsync(CrewonLeave);
        }

    }

我的目标是让我的代码像这样更简单

代码目标

    @if (Crews.Count() > 0)
    {
    <td @onclick="SearchCrews">
        <span style="cursor: pointer;" data-toggle="modal"
            data-target="#@(modalId)">
            @Crews.Count()</span>
    </td>
    }
    else
    {
    <td> </td>
    }

    @code{

        [Parameter]
        public string modalId{get;set;}

        [Parameter]
        public List<DynamicClass> Crews{get; set;}
        [Parameter]
        public EventCallback<List<DynamicClass>> OnCrewsClicked {get; set;}
        private Task SearchCrews()
        {
            return OnCrewsClicked.InvokeAsync(DynamicClass);
        }
    }

问题是我不知道如何放入它,dynamic class因此当组件由带有类的变量列表输入时,该类将是动态的。

有没有办法让它变成这样?

标签: c#blazor

解决方案


CrewOnLeave这完全取决于和之间的关系Crew。如果它们不是同一个基类的两个化身,那么您需要定义一个两者共享的接口。在示例中,界面是空白的,仍然可以使用。

下面是您的代码的简化版本,用于演示处理接口到类和类到接口转换的各种方法。


@page "/Crewzing"
<table>
    <tr>
        @if (_hasCrews)
        {
            <td @onclick="SearchCrews">
                <span style="cursor: pointer;" data-toggle="modal"
                      data-target="#@(modalId)">
                    @Crews.Count()
                </span>
            </td>
        }
        else
        {
            <td></td>
        }

    </tr>
</table>

@code {

    public List<ICrew> Crews => CrewsOnLeave.Count > 0 ? CrewsOnLeave.Select(item => (ICrew)item).ToList() : CrewsOnBoard.Select(item => (ICrew)item).ToList();

    [Parameter] public EventCallback<List<ICrew>> CrewsClicked { get; set; }

    private bool _hasCrews => (this.Crews != null && this.Crews.Count > 0);

    private string modalId = "xxx";

    private void SearchCrews()
    {
        GetCrewType();
        CrewsClicked.InvokeAsync(Crews);
    }

    public interface ICrew
    {
    }

    public class CrewOnBoard : ICrew
    {
        public string Boat { get; set; }
    }

    public class CrewOnLeave : ICrew
    {
        public string Boat { get; set; }
    }

    public List<CrewOnBoard> CrewsOnBoard = new List<CrewOnBoard>()
{
        new CrewOnBoard() { Boat = "Cyclops"},
        new CrewOnBoard() { Boat = "Sirius"}
    };

    public List<CrewOnLeave> CrewsOnLeave = new List<CrewOnLeave>()
{
        new CrewOnLeave() { Boat = "Medusa"},
        new CrewOnLeave() { Boat = "Alderbaran"}
    };

    private void GetCrewType()
    {
        var c = Crews[0] ?? null;
        if (c is CrewOnBoard)
        {
            var crew = Crews.Select(item => (CrewOnBoard)item).ToList();
        }
        else if (c is CrewOnLeave)
        {
            var crew = Crews.Select(item => (CrewOnLeave)item).ToList();
        }
    }
}

推荐阅读