문제

나는 일반적인 클래스

public MyClass<TContext, T> where TContext : DataContext

는 역할을 효과적으로 인스턴스에서 다른

public class MyOtherClass<T> : IEnumerable<T>

고 싶을 적용하는 TContextTable<T>.이 청결한 방법을 적용하는 이?

도움이 되었습니까?

해결책

tcontext에 테이블 인 멤버가 있는지 확인하고 싶습니까?u003CT> ? 그렇다면이를 수행하는 유일한 방법은이 계약에 대한 인터페이스를 정의하고 일반적인 제약 조건을 변경하는 것입니다.

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

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

편집하다

Jason은 내 대답에 명확한 의견을 게시했습니다. 이름 테이블은 정적이 아니며 대신 T 유형에 따라 다릅니다.

이 경우 일반적인 제약을 통해이를 정적으로 시행 할 방법이 없습니다. 당신이 할 수있는 최선은 imytable <>를 구현하고 데이터 컨텍스트와 테이블 인스턴스를 제공하는 어댑터 클래스를 만드는 것입니다.

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

나는 확장하려는 그의 생각을 추가하여 명시적 인터페이스 구현합니다.이 주소를 제이슨의 발언에 대한 액세스 테이블 제공을 통해 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