【问题标题】:Converting a C# method to use generics referencing a property inside将 C# 方法转换为使用引用内部属性的泛型
【发布时间】:2011-09-19 03:49:14
【问题描述】:

我想将一个方法转换为使用泛型。 它目前被硬编码为以下类型:

  • 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 需要引用 DataContext 上的一个属性,即IEnumerable&lt;TSource&gt;。 这是否意味着我需要将 DataContext 作为参数传入还是有更好的方法?

【问题讨论】:

    标签: c# linq generics c#-3.0 foreach


    【解决方案1】:

    听起来您需要参数化DataContext 中的属性名称。一种方法是传入一个函数,该函数接受 DataContext 并返回您的可枚举(Func&lt;DataContext, IEnumerable&lt;TSource&gt;&gt;),然后您将传入像 dc =&gt; 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);
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-07-06
      • 2011-05-08
      • 2013-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多