我正在研究这篇 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 有什么属性?那么是否可以达到我把所有东西都放到基类中的目的呢?
提前致谢
首先,定义一个接口,如下所示:
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
类应该可以正常工作。