Общее исполнение - PullRequest
       12

Общее исполнение

3 голосов
/ 23 января 2009

У меня есть родовой класс

public MyClass<TContext, T> where TContext : DataContext

, который эффективно действует на экземпляр другого

public class MyOtherClass<T> : IEnumerable<T>

Я хочу убедиться, что TContext имеет Table<T>. Есть ли чистый способ обеспечить это?

Ответы [ 3 ]

6 голосов
/ 23 января 2009

Вы хотите проверить, что TContext имеет член, который является таблицей ? Если это так, то единственный способ сделать это - определить интерфейс для этого контракта и изменить общие ограничения

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

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

EDIT

Джейсон опубликовал уточняющий комментарий к моему ответу. Имя таблицы не является статичным, оно зависит от типа 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; } }
}
1 голос
/ 23 января 2009

Я думаю, что в первый раз у 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(); 
  }
}

Я хочу расширить свою мысль, добавив явную реализацию интерфейса. Это отвечает замечанию Джейсона о доступе к свойству таблицы через 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();
0 голосов
/ 23 января 2009

единственный способ применить это, если таблица была в интерфейсе, и вы назначили общее ограничение ... что-то вроде

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