-
19-08-2019 - |
سؤال
لدي فئة عامة
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>