동적 유형의 linq 'First ()'가 런타임에 때때로 실패하는 이유는 무엇입니까?

c# dapper linq

문제

ac # .NET 4.6.1 프로젝트에서 런타임에 linq의 이상한 동작이 발생했습니다. Dapper 쿼리 (여기서는 표시되지 않음)에서 나오는 결과 세트를 유지하기 위해 동적 유형을 재사용하고 있습니다.

다음 코드를 살펴보십시오.

...
IEnumerable<dynamic> resultSet = await dataSource.GetUserInfos(unlockingUserId, applicationName);
...

들어오는 결과 집합에는 여러 열이있는 행이 하나 있습니다.

나중에 코드에서 resultSet 객체에 다른 데이터베이스 쿼리의 결과를 할당합니다.

resultSet = await dataSource.ReleaseLock(userId, unlockingUserId, itemId, sessionId);

이번에는 서버에서 반환 된 행에 여전히 하나의 행이 있지만 '성공'이라고하는 부울 열이 하나만 포함되어 있습니다.

다음 코드는 :

...
if (resultSet.First().success != true)

다음 런타임 예외와 함께 실패합니다.

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException : 'System.Collections.Generic.List'에 'First'에 대한 정의가 없습니다.

결과를 유지하기 위해 다른 동적 객체를 사용할 때 아무런 문제가 없습니다.

IEnumerable<dynamic> unlocked = await dataSource.ReleaseLock(userId, unlockingUserId, itemId, sessionId);

이번에는 다음 코드를 작성합니다.

...
if (unlocked.First().success != true)

잘 작동합니다.

편집 : 그것은 내 편이 었어. GetUserInfos가 IEnumerable 대신 동적으로 반환되었습니다.

인기 답변

Enumerable.First()List 의 메서드가 아니라 Enumerable에 정의 된 확장 메서드입니다. 실제로는 컴파일러 마술을 통해 인스턴스 메서드처럼 보이게 만드는 정적 메서드입니다. 컴파일러는 확장 메서드 호출을 정적 등가로 변환하는 것을 알고 있습니다. 즉, Enumerable.First()Enumerable.First(someEnumerable,...) 됩니다.

First() 동적으로 호출하면 동적 객체에서 메서드로 호출됩니다. 런타임은 객체의 동적 메서드를 검색하므로 정적 메서드를 대신 호출하려고했는지 알 수 없습니다.

정적 형식으로 직접 호출하면 확장 메서드를 사용할 수 있습니다. 즉 if (!Enumerable.First(unlocked)) ...



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow