2017-02-21 1 views
1

내 팀이 .NET 4.0을 4.6.2로 타겟팅하는 응용 프로그램을 업그레이드하는 중입니다. 네, 파티에 늦었습니다. 그러나 결코 늦지 않는 것이 좋습니다.Expression Body 차이점 .NET 4 및 .NET 4.6.2

우리의 응용 프로그램에는 표현식에서 반환 된 메서드의 MethodInfo를 반환하는 확장 메서드가 있습니다. 우리가있는 경우 즉, :

public class Foo 
{ 
    public void DoSomething() { } 
} 

한 다음

Expression<Func<Foo, Action>> = f => f.DoSomething; 

는 다음 방법을 해봐요을 MethodInfo를 반환 우리의 확장 방법은()

코드는에 큰 일을 표현했다 .NET 4.0에서는 작동하지만 .NET 4.6.2에서는 작동하지 않습니다. 이후 코드를 작동하도록 변경했지만 내 질문은 누구든지 .NET 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1 및 4.6.2의 릴리스 노트가 문서화 될 수있는 위치를 알고 있습니까? 나는 아무것도 읽지 않고 여러 번 읽고 읽었습니다.

, 당신은 표현의 방법 기관은 .NET 4.0과 4.6.2 사이의 차이점을 볼 수 있습니다 4.6.2 : enter image description here

.NET에서는이 작업을 수행하는 방법을 알았습니다. 변경 사항이 이미 나와있는 솔루션과 대조되는 부분에 관심이 있습니다.

미리 감사드립니다.

+0

예에서는 위임자를 사용하고 있기 때문에 대리인에게 액세스하는 방법이 변경되어 있기 때문에 가능합니다.거기에 관한 질문이 내 즐겨 찾기 어딘가에 있지만 나는 내 전화에있어. 그러나 이것을 표현식 으로 바꿀 수 있습니다. x = f => f.DoSomething();'그런 식으로 MethodInfo에 접근하십시오. (선호해야합니다) – pinkfloydx33

+0

여기에 나와있는 해답 중 하나가 도움이 될 것입니다. 'Expression >''Expression >'http://stackoverflow.com/a/26976055/491907이 아닙니다. 본질적으로 델리게이트 인 메소드 그룹을 사용하려고하고 있으며 추가로 "unwraping "방법을 얻으려면 – pinkfloydx33

+0

특별히 문서에 관한 질문에 대답하기 위해 변경 사항은 4.5 버전에 관한 것이지만 시스템의 악용 사례로 명시 적으로 문서화 된 것은 아닌지 의심 스럽습니다. 'Delegate' 또는'MethodInfo.CreateDelegate'와 관련하여 찾을 수있는 것이 있다면 – pinkfloydx33

답변

3

컴파일러 Delegate.CreateDelegate() 대신 사용하는 MethodInfo.CreateDelegate() 방법은 상기 C# 1 식

Expression<Func<Foo, Action>> e = f => f.DoSomething; 

의 .NET 4.5

문서화 행동 도입 그것이 Func<Foo, Action>를 나타내는 식을 생성한다는 것이다 컴파일되고 호출 된 경우 Foo을 가져오고 을 반환하면 .DoSomething()이 그 Foo에 있습니다. 이 동작은 변경되지 않았습니다. 문서화 된 동작에 변경 사항이 없으므로 변경 내용에 대한 문서가 없을 수 있습니다. (이러한 변경 사항은 문제를 일으키는 것으로 알려져 있지만 항상 그런 것은 아닙니다).

+0

.NET의 변화가 아니기 때문에 다르게 컴파일되고 있습니까? 우리는 VS2015와 함께 .NET 4를 사용하고 있었고 이제는 VS2015와 함께 .NET 4.6.2입니다. 컴파일러가 동일하지 않습니까? – pdalbe01

+0

컴파일러는 동일하지만 이전 프레임 워크가 없기 때문에 컴파일 할 경우'MethodInfo.CreateDelegate()'를 사용할 수 없습니다. 4.6과 어떻게 비교해 보면, 빈'params '를 가진'params' 메쏘드에 대한 호출은'Array.Empty ()'에 대한 호출로서 컴파일되지만, 존재하지 않는 이전 프레임 워크 버전에서는 컴파일되지 않습니다. –