سؤال

لدي فئة عامة

public MyClass<TContext, T> where TContext : DataContext

الذي يعمل بشكل فعال على مثيل آخر

public class MyOtherClass<T> : IEnumerable<T>

أريد فرض ذلك TContext لديه Table<T>.هل هناك طريقة نظيفة لفرض ذلك؟

هل كانت مفيدة؟

المحلول

هل تريد التحقق من أن TContext لديه عضو وهو Table<T>؟إذا كان الأمر كذلك، فإن الطريقة الوحيدة للقيام بذلك هي تحديد واجهة لهذا العقد وتغيير القيود العامة الخاصة بك

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

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

يحرر

نشر جيسون تعليقًا توضيحيًا على إجابتي.جدول الاسم ليس ثابتًا، بل يعتمد على نوع 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; } }
}

نصائح أخرى

واعتقد ان 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