代码之家  ›  专栏  ›  技术社区  ›  jason

一般强制执行

  •  3
  • jason  · 技术社区  · 17 年前

    public MyClass<TContext, T> where TContext : DataContext
    

    它有效地作用于另一个实例

    public class MyOtherClass<T> : IEnumerable<T>
    

    我想强制执行 TContext 有一个 Table<T>

    3 回复  |  直到 17 年前
        1
  •  6
  •   JaredPar    17 年前

    是否要验证TContext是否有一个表成员<T>?如果是这样的话,唯一的方法就是为这个契约定义一个接口并修改您的通用约束

    interface IMyTable<T> {
      Table<T> Table;
    }
    
    public MyClass<TContext,T> where TContext : DataContext,IMyTable<T>
    

    编辑

    如果是这种情况,那么就没有办法通过泛型约束静态地强制执行。最好是创建一个实现IMyTable的适配器类<&燃气轮机;并提供一个DataContext和一个表实例。

    interface IMyTable2<T> {
      DataContext DataContext {get; }
      Table<T> Table {get; }
    }
    
    class MyAdapter: IMyTable2<T> {
      private MyOtherClass<T> _other;
      public DataContext DataContext { get { return _other.DataContext } }
      public Table<T> Table { get { return _other.TableWithDifferentName; } }
    }
    
        2
  •  1
  •   Amy B    16 年前

    interface IMyTable<T>
    {
      Table<T> TheTable {get;}
    }
    
    public class MyClass<TContext,T> where
      TContext : DataContext,IMyTable<T>
    {
      //silly implementation provided to support the later example:
      public TContext Source {get;set;}
    
      public List<T> GetThem()
      {
        IMyTable<T> x = Source as IMyTable<T>;
        return x.TheTable.ToList(); 
      }
    }
    

    我想通过添加一个显式接口实现来扩展他的思想。这解决了Jason关于通过IMyTable访问表属性的评论。类型必须以某种方式参与,如果您有 IMyTable<T> ,涉及的类型。

    public partial class MyDataContext:IMyTable<Customer>, IMyTable<Order>
    {
      Table<Customer> IMyTable<Customer>.TheTable
      { get{ return this.GetTable<Customer>(); } }
    
      Table<Order> IMyTable<Order>.TheTable
      { get{ return this.GetTable<Order>(); } }  
    }
    

    现在可以这样做:

    var z = new MyClass<MyDataContext, Customer>();
    z.Source = new MyDataContext();
    List<Customer> result = z.GetThem();
    
        3
  •  -1
  •   Joel Martinez    17 年前

    唯一的强制方法是,如果表位于接口中,并且您指定了一个通用约束。。。大概是

    public class MyOtherClass<T> : IEnumerable<T>, IHasTable<T>