我们如何在Generic <t>类上假设bool属性,其中T是自动生成的LINQ2SQL类</t>

时间:2009-11-14 20:23:09

标签: c# wpf linq linq-to-sql generics

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

public abstract class CRUDOperations <T> : where T is????
{
  .......
  protected virtual SoftDelete()
  {
     T.IsDeleted = true;
  }
}

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

相同的Base / Derive概念

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

您可以在界面上声明:

public interface ICanDelete {
    bool IsDeleted {get;set;}
}

让隐式接口实现发挥其神奇作用。然后问题变成:“如何让它知道我的实体实现了这个接口?”。两个选项:

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

    partial class Customer : ICanDelete {}
    partial class Order : ICanDelete {}
    
  • 编辑dbml以将此接口指定为基类:

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

    (这使得LINQ-to-SQL的代码生成为您添加: Some.NameSpace.ICanDelete

然后在通用子句中使用此接口:

where T : ICanDelete

答案 2 :(得分:0)

数据库生成的类不是从实体派生的吗?