C# 如何制作一个可以接受不同对象列表作为参数的通用Blazor组件?
(搜索的字段当前由每个DataAccessObjects中使用的存储过程确定) 我在尝试开发这样一个泛型组件时遇到的问题是,我一开始对泛型不太熟悉(我了解基本概念,使用泛型的语法是什么,等等,但我没有创建很多泛型代码),尤其是在将该概念与Blazor集成时 到目前为止,我尝试的是:C# 如何制作一个可以接受不同对象列表作为参数的通用Blazor组件?,c#,generics,components,fragment,blazor,C#,Generics,Components,Fragment,Blazor,(搜索的字段当前由每个DataAccessObjects中使用的存储过程确定) 我在尝试开发这样一个泛型组件时遇到的问题是,我一开始对泛型不太熟悉(我了解基本概念,使用泛型的语法是什么,等等,但我没有创建很多泛型代码),尤其是在将该概念与Blazor集成时 到目前为止,我尝试的是: 使用继承来接受一个通用的列表,我的系统中的对象将实现这个接口,它将有两个成员:ID和dropdownsplayinfo,这将允许下拉菜单发送关于单击哪个项目的信息,以及为搜索结果中的每个项目提供要显示的内容 这种方法
列表
,我的系统中的对象将实现这个接口,它将有两个成员:ID
和dropdownsplayinfo
,这将允许下拉菜单发送关于单击哪个项目的信息,以及为搜索结果中的每个项目提供要显示的内容@typeparam TDropdownItem
指令允许整个组件中使用的类型与传入的类型相同GetObjectName(ObjectID)
”和“ObjectSearchUpdate
”组件的函数
有没有一种我完全不知道的非常简单的实现方法?我是否在正确的轨道上,只是需要对现有代码进行一系列重构才能使事情正常运行?如果无法实现接口方法,也许您可以尝试创建一个公共代理对象来传递参数 例如,您可以尝试将Id、Name和Delegate作为具有LINQ的代理列表传递 在OnInitialized内或您发起的任何地方准备您的论点 下面是一个简单的概念,它展示了如何使用委派 委托、数据和代理类初始化:
<SearchableDropdown DropdownItems="AvailableClients"></SearchableDropdown>
示例代理创建:
public delegate void OnClick(UIEventArgs eventArgs, int id, string name);
private class ExampleData
{
// let's assume that it has different naming convention for your case
public int IdValue {get;set;}
public string Fullname {get;set;}
}
private class SearchableDropdownItem
{
public int Id {get;set;}
public string Name {get;set;}
public OnClick OnClicked {get;set;}
}
public void Prepare()
{
var dataList=新列表();
对于(int i=0;i新的SearchableDropdownItem(){
//下面是如何设置回调和字段
Id=x.IdValue,
Name=x.全名,
OnClicked=新OnClick(SetClientID)
}).ToList();
}
public void SetClientID(UIEventArgs eventArgs,int-id,字符串名)
{
//实现你的代码
}
并将searchableItemList传递给组件并使用它:
public void Prepare()
{
var dataList = new List<ExampleData>();
for(int i=0; i<3; i++)
{
dataList.Add(new ExampleData(){
IdValue = i+1,
Fullname = "test" + (i + 1)
});
}
var searchableItemList = dataList.Select(x => new SearchableDropdownItem(){
// here is how you can set callback and fields
Id = x.IdValue,
Name = x.Fullname,
OnClicked = new OnClick(SetClientID)
}).ToList();
}
public void SetClientID(UIEventArgs eventArgs, int id, string name)
{
// implement your code
}
...
@foreach(searchableItemList中的var项)
{
@item.Name
}
我能想象的是将ID
和DropdownDisplayInfo
属性的名称设置为可配置的,如
。我不确定这是否会使它更具可重用性。但这仍然留下了函数获取适当数据的问题。我也可以将这些EventCallbacks传递到组件中,但我觉得这在一定程度上否定了将组件放在首位的重要性。
public void Prepare()
{
var dataList = new List<ExampleData>();
for(int i=0; i<3; i++)
{
dataList.Add(new ExampleData(){
IdValue = i+1,
Fullname = "test" + (i + 1)
});
}
var searchableItemList = dataList.Select(x => new SearchableDropdownItem(){
// here is how you can set callback and fields
Id = x.IdValue,
Name = x.Fullname,
OnClicked = new OnClick(SetClientID)
}).ToList();
}
public void SetClientID(UIEventArgs eventArgs, int id, string name)
{
// implement your code
}
<SearchableDropdown ItemList="searchableItemList"></SearchableDropdown>
...
@foreach (var item in searchableItemList)
{
<li id="@item.Id" @onclick="@(e => item.OnClicked(e,client.Id,client.Name))">@item.Name</li>
}