从属性名称到将表达式>传递到映射方法
本文关键字:对象 方法 映射 Func 表达式 从属性 | 更新日期: 2023-09-27 17:55:44
我一直在与以下问题作斗争。我有一个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 表达式以及如何使用表达式树,但我还没有精通应用它们。
这里的问题是我不确定如何为地图方法提供 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>
而不是表达式。