-
19-08-2019 - |
質問
ジェネリッククラスがあります
public MyClass<TContext, T> where TContext : DataContext
他のインスタンスに効果的に作用する
public class MyOtherClass<T> : IEnumerable<T>
TContext
にTable<T>
があることを強制したい。これを強制するクリーンな方法はありますか?
解決
TContextにTable <!> 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; } }
}
他のヒント
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を介したテーブルプロパティへのアクセスに関するJasonの発言に対応しています。タイプは何らかの形で関与している必要があり、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();
それを実施する唯一の方法は、Tableがインターフェイスにあり、一般的な制約を割り当てた場合です...
public class MyOtherClass<T> : IEnumerable<T>, IHasTable<T>
所属していません StackOverflow