繁体   English   中英

从属性名称到传递表达式 <Func<T,object> &gt;映射方法

[英]From property name to passing an Expression<Func<T,object>> to a mapping method

我一直在与以下问题作斗争。 我有一个DataReader类,下面对此进行了简化:

public class DataReader
{
    public string SchemeName { get; set; }        
}

然后,我有一个Map类,它继承了Map方法。

public class DataReaderMap: CsvClassMap<DataReader>
{
   ...
   private void MapPropertyToColumnHeader()
   {
     // do the mapping of column headers in the csv file to the property name on the 
     // DataReader class.

     //This is what I would do in a simple case.
     this.Map(DataReader => DataReader.SchemeName).Name("SName");  
   }
}

我的问题是正确更换线

this.Map(DataReader => DataReader.SchemeName).Name("SName");  

在我的具体情况下,有些更灵活的选择,例如

// This code might be wrong but it is as far as I managed to get!
var par = Expression.Parameter(typeof(DataReader));
var memberExpression = Expression.Property(par, "SchemeName");

// lambaExpression is a LambdaExpression not Expression<Func<DataReader, object>>
// THIS LINE DOES NOT COMPILE OF COURSE!
var lambaExpression = Expression.Lambda(memberExpression, par);

var comp = lambaExpression.Compile();  // this is no useful, is it?

// kvPair.Value is "SName" and is read off a mapping file I use
this.Map(lambaExpression).Name(kvPair.Value);

我或多或少地了解了什么是Lamba表达式以及如何使用表达式树,但是我还没有熟练地应用它们。

这里的问题是我不确定如何为Map方法提供lambaExpression类型

Expression<Func<DataReader, obj>>

如预期的那样。

当我调试时,我看到lambaExpression显示为

lambaExpression
{Param_0 => Param_0.SchemeName}
Body: {Param_0.SchemeName}
CanReduce: false
DebugView: ".Lambda #Lambda1<System.Func`2[csvReaderConsole.Readers.DataReader,System.String]>    (csvReaderConsole.Readers.DataReader $var1)\r\n{\r\n    $var1.SchemeName\r\n}"
Name: null
NodeType: Lambda
Parameters: Count = 1
ReturnType: {Name = "String" FullName = "System.String"}
TailCall: false
Type: {Name = "Func`2" FullName = "System.Func`2[[csvReaderConsole.Readers.DataReader,        csvReaderConsole, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"}

但我仍然不明白如何使用它来推导等效表达式

DataReader => DataReader.SchemeName

我通常会使用的。

假设Map函数具有签名string Map(Expression<Func<DataReader, object>> expr) ,则只需更改如下的lambda表达式即可:

var lambaExpression = Expression.Lambda<Func<DataReader, object>>(memberExpression, par);

除非Map接受Func<DataReader, object>而不是Expression,否则无需对其进行编译。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM