C#将数据直接映射到对象

时间:2017-06-28 18:19:34

标签: c# web-scraping automapper

我正在创建一个从Web中提取HTML表并将它们转换为对象的库。我有一个ColumnConfigurator对象,它预先配置特定表的布局方式:

config.Column().Text().MapTo(/*Class.TextPropertyName*/); //What I want to be able to do
config.Column().Date().MapTo(/*Class.DatePropertyName*/);

上面的代码是我希望在配置中能够做什么的一般概念(注意第一个函数创建一个新列并返回它,后续方法设置对象的配置),然后当表格被映射到我想要检索传递给MapTo的参数并让它自动解析为给定对象的正确属性时。

这里有什么让我最困惑的事情:我想让主表对象变得通用(ParsingTable<T>),这样理论上任何对象都可以映射到。这意味着没有任何属性可以提前使用。我想将T.Property传递给方法,以便它知道如何自动化。有没有办法做到这一点?我已经阅读了一些关于反思的内容,但听说它对性能不利。

1 个答案:

答案 0 :(得分:1)

有关创建流畅界面(您正在为配置执行的操作)的信息,请参阅此处:creating API that is fluent

要使MapTo方法从泛型类接受属性名称,最终会得到如下内容:

public class ParsingTable<T>
{
   /*** All the other stuff ***/

   public static IColumnConfiguration MapTo(this IColumnConfiguration config, Expression<Func<T, object>> property)
   {
      if (property.Body is MemberExpression)
      {
         config.Property = (property.Body as MemberExpression).Member as PropertyInfo;
      }
      else
      {
         config.Property = (((UnaryExpression)property.Body).Operand as MemberExpression).Member as PropertyInfo;
      }
   }
}

public interface IColumnConfiguration
{
     PropertyInfo Property { get; set; }
}

然后,当您进行解析时,您将为每个值/列调用PropertyInfo.SetValue()函数。

你是正确的,与直接属性集相比,这可能会在较慢的一端。如果这是一个大问题,这在很大程度上取决于你的情况。如果你真的想避免SetValue()调用,下一步是为每个列集编译一个lambda表达式。

注意,我从这里获取了上面的一些代码:http://blog.raffaeu.com/archive/2010/06/26/how-to-write-fluent-interface-with-c-and-lambda.aspx