3

ジェネリッククラスがあります

public MyClass<TContext, T> where TContext : DataContext

別のインスタンスに効果的に作用します

public class MyOtherClass<T> : IEnumerable<T>

TContextを強制したいTable<T>。これを実施するためのクリーンな方法はありますか?

4

3 に答える 3

6

TContextにTable<T>であるメンバーがあることを確認しますか?その場合、それを行う唯一の方法は、このコントラクトのインターフェースを定義し、一般的な制約を変更することです。

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

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

編集

ジェイソンは私の答えに明確なコメントを投稿しました。Tableという名前は静的ではなく、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; } }
}
于 2009-01-23T18:23:10.467 に答える
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(); 
  }
}

明示的なインターフェイスの実装を追加して、彼の考えを拡張したいと思います。これは、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();
于 2009-01-23T20:14:18.090 に答える
-1

それを強制する唯一の方法は、テーブルがインターフェースにあり、ジェネリック制約を割り当てた場合です...

public class MyOtherClass<T> : IEnumerable<T>, IHasTable<T>
于 2009-01-23T18:23:50.887 に答える