2011-06-21 4 views
4

ジェネリックを使用するメソッドを変換したいと思います。データコンテキストの部分クラスで内部でプロパティを参照するジェネリックを使用するようにC#メソッドを変換する

  • DataContext.Documentをして、この部分クラスでもobject
  • 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は、IEnumerable<TSource>のDataContextのプロパティを参照する必要があります。 これは、DataContextをパラメータとして渡す必要があることを意味しますか、それとも良い方法ですか?

答えて

2

プロパティ名をDataContextにパラメータ化する必要があるようです。これを行う1つの方法は、DataContextを取り、あなたの列挙型(a Func<DataContext, IEnumerable<TSource>>)を返し、そのパラメータとしてdc => dc.Documentのようなラムダを渡す関数を渡すことです。

もう1つのオプションは、プロパティの名前を文字列として渡してから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); 
     } 
    } 
} 
関連する問題