2014-04-01 2 views
0

으로 전달하는 데 다음과 같은 문제가 발생했습니다. 속성 이름에서 표현식 <Func <T,object>>을 매핑 방법

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

그런 다음 나는지도 방법을 상속하는지도 클래스가 있습니다 : 나는 아래의 단순화 된 DataReader 클래스가 있습니다.

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 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); 

라인 내 특정 경우에는 좀 더 유연한 뭔가

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

에게 대체 무슨 람 바어 표현 표현 나무가 어떻게 사용될 수 있는가? 그러나 나는 아직 그들을 적용하는 데 능숙하지 않다.

여기서 문제는 예상대로 유형

Expression<Func<DataReader, obj>> 

의 lambaExpression과지도 방법을 제공하는 방법을 잘 모르겠습니다이다. 내가 디버깅 할 때

나는 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 

에 해당하는 표현을 poduce이를 어떻게 사용하는지 이해하지 못한다.

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

MapFunc<DataReader, object> 아니라 표현을 허용하지 않는 컴파일 할 필요는 없다 : 그지도 기능을 가정

+0

지도 방법의 선언을 표시 할 수 있습니까? Expression이나 Func을 받아들이는지 확실하지 않습니다. –

+0

'var lambaExpression = Expression.Lambda (memberExpression, par);'괜찮습니다. 어떤 오류가 발생하고 있습니까? – Servy

+0

대단히 감사 드미트리 내가 이해했습니다. 이제 완벽하게 작동합니다. 즉, Lamba 표현식에서 다른 표현식으로 CAST 할 필요가 없습니다. Lamba <>를 사용하여 적절한 표현식 유형을 생성 할 수 있습니다. 직접 실행 창을 사용하여 Expression.Lambda > (memberExpression, par) 및 Expression.Lambda (memberExpression, par) 호출의 출력을 비교할 때주의해야합니다. 나는 똑같은 출력을 얻는다. 그러나 그들의 유형은 명백하게 다르다. – user3099312

답변

0

는 단지처럼 람다 식을 변경해야 string Map(Expression<Func<DataReader, object>> expr) 서명이 있습니다.