c# - 具有动态更改类的事件回调?
问题描述
我有一些情况,当我有一些带有类的列表时,例如这样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
因此当组件由带有类的变量列表输入时,该类将是动态的。
有没有办法让它变成这样?
解决方案
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();
}
}
}