-
19-08-2019 - |
문제
나는 일반적인 클래스
public MyClass<TContext, T> where TContext : DataContext
는 역할을 효과적으로 인스턴스에서 다른
public class MyOtherClass<T> : IEnumerable<T>
고 싶을 적용하는 TContext
가 Table<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>
제휴하지 않습니다 StackOverflow