如何将 Linq First 与通用 <T> 基类一起使用

问题描述 投票:0回答:1

我正在研究这篇 Xaml Brewer 文章,并对其进行轻微修改以使用我的模型。它使用 T 类型的通用 MasterDetailViewModel 基类。

基类是这样声明的

    public abstract partial class MasterDetailViewModel<T> : ObservableObject
    {
        private readonly ObservableCollection<T> items = new();
etc...

我的派生类声明为 .

    public partial class HomePageViewModel : MasterDetailViewModel<Tenant>
    {

etc..

班级租户是

[Table("tenants")]
public partial class Tenant
{
    //[Column("email")]
    public string Email { get; set; }

    //[Column("first_name")]
    public string FirstName { get; set; }

    [Key]
    public int Id { get; set; }
etc..

我的派生类包含一个 RelayCommand 和一个方法

    [RelayCommand]
        private void Delete(int param) //param is Id of selected list item
    {
        DeleteCommand_Executed(param);
    }

        private void DeleteCommand_Executed(int parm)
        {
            if (parm > 0)
            {
                var toBeDeleted = Items.First(c => c.Id == parm); //get the record with this Id
                DeleteItem(toBeDeleted); //delete from the database
            }
        }

我想将 RelayCommand 和 DeleteCommand_Executed 方法移到基类中。如果我只是将中继命令移到基类中并添加此

protected abstract void DeleteCommand_Executed(int parm);
然后在派生类中使用它
protected override void DeleteCommand_Executed(int parm) etc.
一切正常,但如果我将 DeleteCommand_Executed 移到基类中,我会收到此错误

错误(活动)CS1061“T”不包含“Id”的定义,并且找不到接受类型“T”的第一个参数的可访问扩展方法“Id”(您是否缺少 using 指令或程序集引用? )

我尝试添加类型标识符

var toBeDeleted = Items.First<T>(c => c.Id == parm); 
我看过一些关于 SO 的类似问题和一些谷歌搜索的项目,我认为我被告知的是,在表达式运行之前 T 是不知道的,所以它不知道 T 有什么属性?那么是否可以达到我把所有东西都放到基类中的目的呢?

提前致谢

c# linq generics winui-3
1个回答
0
投票

首先,定义一个接口,如下所示:

public interface IHasId
{
    int Id { get; set; }
}

然后,重新定义

MasterDetailViewModel
Tenant
类,如下所示:

public abstract partial class MasterDetailViewModel<T> : ObservableObject where T: IHasId
public partial class Tenant : IHasId

现在,将

DeleteCommand_Executed
方法移至
MasterDetailViewModel
类应该可以正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.