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);
Map
이 Func<DataReader, object>
아니라 표현을 허용하지 않는 컴파일 할 필요는 없다 : 그지도 기능을 가정
지도 방법의 선언을 표시 할 수 있습니까? Expression이나 Func을 받아들이는지 확실하지 않습니다. –
'var lambaExpression = Expression.Lambda (memberExpression, par);'괜찮습니다. 어떤 오류가 발생하고 있습니까? – Servy
대단히 감사 드미트리 내가 이해했습니다. 이제 완벽하게 작동합니다. 즉, Lamba 표현식에서 다른 표현식으로 CAST 할 필요가 없습니다. Lamba <>를 사용하여 적절한 표현식 유형을 생성 할 수 있습니다. 직접 실행 창을 사용하여 Expression.Lambda> (memberExpression, par) 및 Expression.Lambda (memberExpression, par) 호출의 출력을 비교할 때주의해야합니다. 나는 똑같은 출력을 얻는다. 그러나 그들의 유형은 명백하게 다르다. –
user3099312