我想转换一个方法来使用泛型.
它目前硬编码为以下类型:
> DataContext.Document在数据上下文的部分类中并从对象继承
> DataContext.Documents也在这个部分类中继承自Linq.Table< Document>> Import.Document继承自定义类ImportObject原始方法:
public void ProcessDocuments(Delegate method, params object[] args) { using (DataContext dc = new DataContext()) { dc.ObjectTrackingEnabled = false; // Map from DataContext object to ImportObject Mapper.CreateMap<Document, Import.Document>(); // Loop through DataContext objects foreach (Document d in dc.Documents) { Import.Document doc = Mapper.Map<Document, Import.Document>(d); args[0] = doc; method.DynamicInvoke(args); } } }
尝试方法:
public void ProcessImportObjects<TSource, TDestination> (Action<TDestination, ImportDataSource, int> processMethod, ImportDataSource importSource, int resultId) { using (DataContext dc = new DataContext()) { dc.ObjectTrackingEnabled = false; Mapper.CreateMap<TSource, TDestination>(); foreach (TSource d in dc.Documents) // PROBLEM: Hard-coded reference to property on DataContext { TDestination doc = Mapper.Map<TSource, TDestination>(d); processMethod(doc, importSource, resultId); } } }
(这里,TDestination应该是ImportObject类型,但我不知道如何表达它.)
如注释中所示,foreach需要引用DataContext上的属性,该属性是IEnumerable< TSource>.
这是否意味着我需要将DataContext作为参数传递或是否有更好的方法? 听起来你需要在DataContext中参数化属性名称.一种方法是传入一个函数,它接受一个DataContext并返回你的枚举(一个Func< DataContext,IEnumerable< TSource>>),然后你传入一个像dc =>这样的lambda. dc.Document作为该参数.另一个可行(但没有类型安全性)的选项是将属性的名称作为字符串传递,然后使用Reflection来访问它.
public void ProcessImportObjects<TSource, TDestination> (Func<DataContext, IEnumerable<TSource>> dcProperty, Action<TDestination, ImportDataSource, int> processMethod, ImportDataSource importSource, int resultId) { using (DataContext dc = new DataContext()) { dc.ObjectTrackingEnabled = false; Mapper.CreateMap<TSource, TDestination>(); foreach (TSource d in dcProperty(dc)) { TDestination doc = Mapper.Map<TSource, TDestination>(d); processMethod(doc, importSource, resultId); } } }
精彩评论