에서 람다 식을 구현 나는이 사용 된 CodeDom 같은 것을 쓰고 싶어요.닷넷 된 CodeDom은 .NET
1
A
답변
3
짧은 대답 : CodeDOM은 람다를 지원하지 않습니다.
긴 답변 : CodeDOM은 람다를 지원하지 않으므로 해결 방법을 사용해야합니다. 일부 옵션 :
사용
CodeSnippetExpression
:new CodeMethodInvokeExpression( collectionExpression, "Where", new CodeSnippetExpression("x => x.Id == 2"));
이 방법을 사용하면 된 CodeDom 사용의 장점의 대부분을 잃게하지만, 쉽게 그리고 당신은 정확하게 당신이 원하는 것을 할 수 있습니다.
를 참조하는 대리자를 사용하여 다음 람다에서 코드를 포함하는 방법을 만들고 :이 방법으로
private void IsIdTwo(YourEntityType x) { return (x.Id == 2); } … collection.Where(IsIdTwo)
이슈가 다른 생성하는되어
var lambdaMethod = new CodeMemberMethod { Name = "IsIdTwo", Parameters = { new CodeParameterDeclarationExpression( new CodeTypeReference("YourEntityType"), "x") }, Statements = { new CodeMethodReturnStatement( new CodeBinaryOperatorExpression( new CodePropertyReferenceExpression( new CodeVariableReferenceExpression("x"), "Id"), CodeBinaryOperatorType.ValueEquality, new CodePrimitiveExpression(2))) } }; … new CodeMethodInvokeExpression( collectionExpression, "Where", new CodeMethodReferenceExpression(null, "IsIdTwo"))
이 코드 등이 생성 일반적으로 사용자가
IQueryable<T>
을 Entity Framework와 같이 사용하고 있기 때문에 쿼리를 표현식으로 사용해야하는 경우 원하는 코드보다 읽기 쉽고 읽기 쉬운 코드가 필요하지 않습니다. 로슬린처럼, 람다를 지원하는 코드 생성 라이브러리스위치 :
using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory; … InvocationExpression( MemberAccessExpression( SyntaxKind.SimpleMemberAccessExpression, IdentifierName("collection"), IdentifierName("Where")), ArgumentList( SingletonSeparatedList( Argument( SimpleLambdaExpression( Parameter(Identifier("x")), BinaryExpression( SyntaxKind.EqualsExpression, MemberAccessExpression( SyntaxKind.SimpleMemberAccessExpression, IdentifierName("x"), IdentifierName("Id")), LiteralExpression( SyntaxKind.NumericLiteralExpression, Literal(2))))))))
또는
SyntaxGenerator
를 사용하여 :var generator = SyntaxGenerator.GetGenerator(new AdhocWorkspace(), LanguageNames.CSharp); generator.InvocationExpression( generator.MemberAccessExpression(generator.IdentifierName("collection"), "Where"), generator.ValueReturningLambdaExpression( "x", generator.ValueEqualsExpression( generator.MemberAccessExpression(generator.IdentifierName("x"), "Id"), generator.LiteralExpression(2))))
여기 명백한 단점은 당신이 당신의 코드를 다시 작성해야 할 것입니다.
관련 문제
- 1. 닷넷
- 2. ListBox에서 원을 채우십시오. C# .Net Winforms의 닷넷
- 3. 닷넷 KeyEventArgs는 C# .NET 응용 프로그램에
- 4. 자바의 NIO 선택기와 동일한 .NET 닷넷
- 5. 오픈 아이디 커넥트 닷넷 (OpenID Connect) 닷넷
- 6. CodeDOM은 구문 검사를 수행하는 유일한 방법입니까?
- 7. 닷넷 직접
- 8. 닷넷
- 9. 닷넷 등록
- 10. ECDsa Linux의 닷넷 코어
- 11. 닷넷 : 스레드
- 12. 닷넷 3.5 응용 프로그램
- 13. 닷넷 대 자바 작업
- 14. FrameLog와 닷넷 프레임 워크
- 15. 닷넷 코어 시드 작업
- 16. UTC GMT 대 - 자바 닷넷 대 닷넷 UTC와 GMT에서
- 17. 닷넷 강화 스캐닝
- 18. ColdFusion에서 닷넷 클래스는
- 19. 닷넷 성능 도구
- 20. .Net 4.5 대. 닷넷 3.5 RegSetValueEx는 낱장 널 문자를 반환합니다.
- 21. Objective C와의 닷넷 비교
- 22. 닷넷 핵 설치
- 23. 지혜의 펄. 닷넷 프로그래머
- 24. 우분투에 닷넷 코어를 배포 할 때 누락 된 DLL이 있습니다.
- 25. CodeDom은 소스 코드 파일을 프로젝트에 추가 할 수 있습니까?
- 26. 닷넷 핵심 마이그레이션
- 27. 장고 on 닷넷 인프라?
- 28. 보호 바이트 데이터 닷넷
- 29. 필터 배열은 닷넷 2.0
- 30. . 닷넷 코어가있는 SAP HANA 용 닷넷 커넥터
이 답변은 귀하의 경우 http://stackoverflow.com/a/3273307/920557에 도움이 될 수 –
은'X => x.Id == 2' 컴파일됩니다와 같은 확장 메서드에 전달 대의원. 이 경우'Func'은 https://msdn.microsoft.com/en-us/library/system.linq.enumerable.where(v=vs.110).aspx를 참조하십시오. –
다음은 Expression to CodeDom의 예제입니다 전환 https://csharphardcoreprogramming.wordpress.com/2014/01/15/reflection-part-5-professional-codedom-lambda-expression-tree/ –