C# 我们如何在泛型上假设布尔属性<;T>;类,其中T是自动生成的LINQ2SQL类

C# 我们如何在泛型上假设布尔属性<;T>;类,其中T是自动生成的LINQ2SQL类,c#,wpf,linq,linq-to-sql,generics,C#,Wpf,Linq,Linq To Sql,Generics,我正在WPF应用程序中对数据库生成的类(使用LINQ2SQL)执行CRUD操作。我的所有数据库表都有IsDelete属性存在。因此,我想定义一个抽象/接口类来执行SoftDelete()。我这里的问题是,如何定义泛型类以访问T.IsDelete=true?或者在代码中,我想做如下的事情 public abstract class CRUDOperations <T> : where T is???? { ....... protected virtual SoftDelete

我正在WPF应用程序中对数据库生成的类(使用LINQ2SQL)执行CRUD操作。我的所有数据库表都有IsDelete属性存在。因此,我想定义一个抽象/接口类来执行SoftDelete()。我这里的问题是,如何定义泛型类以访问T.IsDelete=true?或者在代码中,我想做如下的事情

public abstract class CRUDOperations <T> : where T is????
{
  .......
  protected virtual SoftDelete()
  {
     T.IsDeleted = true;
  }
}
公共抽象类CRUDOperations:其中T是????
{
.......
受保护的虚拟软删除()
{
T.IsDeleted=true;
}
}

其中T是由LINQ到SQL(DBML)生成的DB表类,我不能在其上强加接口或基类?。或者数据库中是否有一种技术可以使基表具有与C#

相同的基/派生概念?数据库生成的类不是从实体派生的吗?

1)定义ISoftDelete

public interface ISoftDelete
{
  bool IsDeleted { get; set; }
}
2) 为所有实体创建分部类

public partial class MyLinqEntity : ISoftDelete { }
public partial class MyOtherLinqEntity : ISoftDelete { }
public partial class MyFurtherLinqEntity : ISoftDelete { }
3) 将接口添加到泛型类型限制

public abstract class CRUDOperations <T> : where T is ISoftDelete
公共抽象类CRUDOperations:其中T是ISoftDelete

您可以在界面上声明:

public interface ICanDelete {
    bool IsDeleted {get;set;}
}
让隐式接口实现发挥它的魔力。然后问题变成了:“如何让它知道我的实体实现了这个接口?”。两种选择:

  • 为每个实体(在不同的文件中)添加分部类:

  • 编辑dbml以将此接口指定为基类:

    <Database EntityBase="Some.NameSpace.ICanDelete" ... >
    

    这就是我在MyTableClass中看到的:INotifyPropertyChanging,INotifyPropertyChangedSounds,比如EF;问题是LINQ to SQLThank,看起来像是一个解决方案,但是Step2对我所有的Table类来说都是一项巨大的工作,对吗?是的。在设计器中还有其他方法可以做到这一点,但我更喜欢这种方法,因为我可以使用所有这些部分来修改实体。此外,如果我不得不放弃DBML并重新开始(发生的事情比我希望的要多),我就不必重做所有的定制工作。IIRC,你不能在设计器中这样做-你必须手工编辑DBML。
    <Database EntityBase="Some.NameSpace.ICanDelete" ... >
    
    where T : ICanDelete