我有一个通用类
public MyClass<TContext, T> where TContext : DataContext
有效地作用于另一个
的实例public class MyOtherClass<T> : IEnumerable<T>
我想强制TContext
有一个Table<T>
。是否有一种干净的方法来强制执行此操作?
答案 0 :(得分:6)
您是否要验证TContext是否具有表&lt; T&gt;?的成员?如果是这样,唯一的方法是为此合约定义一个接口并更改您的通用约束
interface IMyTable<T> {
Table<T> Table;
}
public MyClass<TContext,T> where TContext : DataContext,IMyTable<T>
修改强>
杰森在我的回答中发表澄清评论。名称Table不是静态的,而是取决于T的类型。如果是这种情况,那么就无法通过通用约束来静态强制执行此操作。您可以做的最好的事情是创建一个实现IMyTable&lt;&gt;的适配器类。并提供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 :(得分:1)
我认为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();
答案 2 :(得分:-1)
强制执行它的唯一方法是,如果Table在一个接口中,并且你分配了一个通用约束......那么类似
public class MyOtherClass<T> : IEnumerable<T>, IHasTable<T>