将C#方法转换为使用引用内部属性的泛型
本文关键字:内部 引用 属性 泛型 方法 转换 | 更新日期: 2023-09-27 18:00:03
我想将一个方法转换为使用泛型。它目前被硬编码为以下类型:
- 数据上下文的分部类中的
DataContext.Document
并继承自object
DataContext.Documents
也在这个偏类中并且继承自Linq.Table<Document>
- 从自定义类
ImportObject
继承的Import.Document
原始方法:
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 => dc.Document
的lambda作为该参数。
另一个可行的选项(但没有类型安全)是将属性的名称作为字符串传递,然后使用反射来访问它
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);
}
}
}