2016-06-27 3 views
0

테스트 목적으로 EntityDescriptor 클래스의 인스턴스를 만들어야합니다. 이것은 직접 수행 할 수 없으므로 생성자가 공개되지 않습니다.EntityDescriptor 클래스의 인스턴스를 만드는 방법

그렇기 때문에 리플렉션을 사용하여 인스턴스를 만들었습니다.

EdmModel model = new EdmModel(); 
var constructors = typeof(EntityDescriptor).GetConstructors(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); 
var entityDescripto = constructors[0].Invoke(new object[] { model }) as EntityDescriptor; 

나는 클래스의 단일 생성자가 EdmModel 유형의 인수 하나를 사용한다는 것을 알고 있습니다. 하지만 위의 코드 나는 다음과 같은 예외 호출 할 때 :

System.ArgumentException : 다스 OBJEKT MIT 민주 공화국 통상 "Microsoft.Data.Edm.Library.EdmModel"을 kann nicht 서재 통상에서 "System.Data.Services을. Client.ClientEdmModel "konvertiert werden.

이는 :

형 "Microsoft.Data.Edm.Library.EdmModel"의 목적은 유형 "System.Data.Services.Client.ClientEdmModel"로 변환 될 수 없다.

그러나 어디에도 클래스 ClientEdmModel을 찾을 수 없습니다. 아무도 아이디어가 있니?

+0

영어로 예외를 번역 해 주실 수 있습니까? –

+0

물론. 영어 번역을 추가했습니다. – scher

답변

1

문제에 대한 예외 메시지가 분명하며 개체 유형이 잘못되었습니다. 선택한 디 컴파일러를 시작하면 언급 한 생성자가 System.Data.Services.Client.ClientEdmModel 인스턴스를 인수로 사용한다는 것을 알 수 있습니다. 이 클래스는 내부 클래스이기도하므로 리플렉션을 사용하여 인스턴스를 만들어야합니다. 다음은 원하는 객체를 만드는 작은 예제입니다.

var entityDescriptorType = typeof (EntityDescriptor); 
//using .Assembly.GetType() on a type known to be in the right assembly 
//is a fast way to get nonpublic types by fullname 
var clientEdmModelType = entityDescriptorType.Assembly.GetType("System.Data.Services.Client.ClientEdmModel"); 

var clientEdmModelCtorArgs = new object[] {DataServiceProtocolVersion.V1}; 
var clientEdmModelCtor = clientEdmModelType.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, 
    null, new[] {typeof (DataServiceProtocolVersion)}, null); 
var clientEdmModelInstance = clientEdmModelCtor.Invoke(clientEdmModelCtorArgs); 

var entityDescriptorCtorArgs = new[] {clientEdmModelInstance}; 
var entityDescriptorCtor = entityDescriptorType.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, 
    null, new[] {clientEdmModelType}, null); 
var entityDescriptorInstance = entityDescriptorCtor.Invoke(entityDescriptorCtorArgs); 
+0

한편 나는 나를위한 해결책을 발견했다 : 나는 null로 refelction을 통해 EntityDescriptor의 생성자를 호출한다. 당신의 대답은 더 정교합니다. 그것이 내가 대답으로 표시 한 이유입니다. – scher

관련 문제