我有一个通用的类

public MyClass<TContext, T> where TContext : DataContext

这有效地作用在另一个实例

public class MyOtherClass<T> : IEnumerable<T>

我想执行该TContext具有Table<T>。有没有干净的方式来执行呢?

有帮助吗?

解决方案

您想验证TContext具有部件,其一个表?如果是这样,要做到这一点的唯一方法是定义一个接口,用于本合同,并改变你的通用约束

interface IMyTable<T> {
  Table<T> Table;
}

public MyClass<TContext,T> where TContext : DataContext,IMyTable<T>

修改

杰森贴到我的回答澄清评论。名字表是不固定的,它代替依赖于T的类型

如果是这样的话那么就没有办法通过通用约束来静态地执行此操作。你可以做的最好的是创建一个实现IMyTable <>,并提供一个DataContext和Table实例适配器类。

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; } }
}

其他提示

我觉得JaredPar当时的想法是在第一时间周围。

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();

执行它,如果表是一个接口,而你分配一个通用的限制......唯一的办法所以像

public class MyOtherClass<T> : IEnumerable<T>, IHasTable<T>
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top