0

잠시 동안 나를 미치게했기 때문에이 정보를 공유하고 있습니다. 따라서 누군가를 위해서 질문과 답변을 게시하고 있습니다. 같은 상황에 처한다.System.Data.Entity.Core.Objects.ObjectQuery '에'EntitySet '에 대한 정의가 없습니다.

내 프로젝트에서 리플렉션을 사용하여 제네릭 형식의 값을 가져 왔습니다. 제네릭 형식 메서드 호출에 문제가있는 것이 아니라 실제 반환 값 자체가 제네릭 형식이라는 점입니다. 나는 사전에 제네릭 형식 매개 변수를 알 수 없기 때문에

, 나는 반환 된 개체를 통해, 아래와 같은 솔루션을 사용할 수 없습니다

method = method.MakeGenericMethod(typeof(SomeClass)); 
var result = method.Invoke(service, null); 

그래서, 내가 한 것은이었다, 동적 유형을 사용하여, 반환 된 객체에 대한 속성 이름 호출. 내가 엔티티 프레임 워크에 대한 오픈 소스 확장 라이브러리 (EntityExtensions)를 만드는거야 다른 솔루션을 통해 코드를 복사하기로 결정 때까지 지금

var method = octx.GetType().GetMethods().First(x => x.Name == nameof(octx.CreateObjectSet) 
&& x.DeclaringType == typeof(ObjectContext)); 
var generic = method.MakeGenericMethod(type); 
dynamic value = generic.Invoke(octx, null);// => This is the generic typed return value. 
// below, Using dynamic will work, with the pitfal of no compiler checks 
EntitySet set = value.EntitySet; 

, 즉 완벽하게 잘 작동했다.

이전 솔루션과 동일한 코드 줄이 더 이상 새로운 솔루션에서 작동하지 않습니다. 그것은보고합니다 : System.Data.Entity.Core.Objects.ObjectQuery '에 대한 정의가 포함되어 있지 않습니다'EntitySet '

나를 미치게 한 것은 디버거에서 실제 속성을 볼 수 있습니다! 동일한 이름을 가진 속성이 있지만 동적 객체에이 속성이 없다는 것에 대한 예외가 발생합니다.

나는 답을 명확하게하기 위해 답으로 쓰고 있습니다.

답변

1

저는 두 프로젝트를 비교하면서 동일한 .Net 버전, 동일한 라이브러리, 동일한 모든 것을 사용하도록했습니다. 그리고 그들은 동일했습니다! 저를 얻었다

IsVisible: true 

는 제네릭 형식 매개 변수에 대해 생각하는 :

결국, 나는 하나의 차이가 있음을 발견 할 때 그건, 모두 직접 실행 창에 입력 정의를 도말하고이를 비교 시작 그래서 두 프로젝트를 비교해 보았습니다 ... 새로운 프로젝트 클래스는 개인용으로 설정되었고 이전 프로젝트 클래스는 공개로 설정되었습니다.

Visual Studio 디버거가이를 수행 할 수 있도록 반사가 올바른 일반 반환 형식을 읽을 수 없게 만들었습니다.

그래서 솔루션은 단순히 유형을 개인에서 공공으로 변경하는 것이 었습니다 (이 경우에는 할 수있었습니다). 모든 것이 매력처럼 작동했습니다.

나는 이상한 상황이 발생하면 누군가에게 약간의 시간을 절약하기를 바랍니다.

관련 문제