C# 如何制作一个可以接受不同对象列表作为参数的通用Blazor组件?

C# 如何制作一个可以接受不同对象列表作为参数的通用Blazor组件?,c#,generics,components,fragment,blazor,C#,Generics,Components,Fragment,Blazor,(搜索的字段当前由每个DataAccessObjects中使用的存储过程确定) 我在尝试开发这样一个泛型组件时遇到的问题是,我一开始对泛型不太熟悉(我了解基本概念,使用泛型的语法是什么,等等,但我没有创建很多泛型代码),尤其是在将该概念与Blazor集成时 到目前为止,我尝试的是: 使用继承来接受一个通用的列表,我的系统中的对象将实现这个接口,它将有两个成员:ID和dropdownsplayinfo,这将允许下拉菜单发送关于单击哪个项目的信息,以及为搜索结果中的每个项目提供要显示的内容 这种方法

(搜索的字段当前由每个DataAccessObjects中使用的存储过程确定)

我在尝试开发这样一个泛型组件时遇到的问题是,我一开始对泛型不太熟悉(我了解基本概念,使用泛型的语法是什么,等等,但我没有创建很多泛型代码),尤其是在将该概念与Blazor集成时

到目前为止,我尝试的是:

  • 使用继承来接受一个通用的
    列表
    ,我的系统中的对象将实现这个接口,它将有两个成员:
    ID
    dropdownsplayinfo
    ,这将允许下拉菜单发送关于单击哪个项目的信息,以及为搜索结果中的每个项目提供要显示的内容
  • 这种方法的问题是,我必须为DataAccess层创建接口&我在Blazor应用程序中创建的服务也是如此。这是一个很长的级联问题,它会让我陷入界面创建兔子洞。我甚至不能100%确定这个解决方案最终是否会奏效

  • 使用
    @typeparam TDropdownItem
    指令允许整个组件中使用的类型与传入的类型相同
  • 这样做的一个明显问题是,使用SearchableDropdown组件为RenderFragment提供适当的标记的人仍然要承担很多责任,此外,还有一个问题是使用泛型“
    GetObjectName(ObjectID)
    ”和“
    ObjectSearchUpdate
    ”组件的函数


    有没有一种我完全不知道的非常简单的实现方法?我是否在正确的轨道上,只是需要对现有代码进行一系列重构才能使事情正常运行?

    如果无法实现接口方法,也许您可以尝试创建一个公共代理对象来传递参数

    例如,您可以尝试将IdNameDelegate作为具有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>
    }