2011-06-21 86 views
4

我想將一種方法轉換爲使用泛型。 這是目前硬編碼到這些類型:轉換C#方法以使用引用屬性內的泛型

  • 在數據上下文的分部類DataContext.Documentobject
  • 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); 
     } 
    } 
} 

(這裏,TDestinationImportObject類型,但我不知道怎麼表達)

由於在評論中所示, foreach需要引用DataContext上的一個屬性,該屬性是IEnumerable<TSource>。 這是否意味着我需要將DataContext作爲參數傳遞,還是有更好的方法?

回答

2

這聽起來像您需要參數化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); 
     } 
    } 
} 
相關問題