2013-08-04 3 views
2

나는 동적 객체를 반환하는 MyLibrary1에 정적 메서드가 있습니다.RuntimeBinderException 다른 라이브러리에있는 메서드에서 'dynamic'속성의 속성을 읽을 때

public static dynamic GetObjects() 
{ 
return new { test = "something" }; 
} 

그러나 위의 방법을 MyLibrary2에서 액세스하면 디버거에 값과 개체가 올바르게 반환됩니다.

dynamic b = MyLibrary1.GetObjects(); 
string name = b.test; 

은 내가 b.test을 읽을 때 " 'object' does not contain a definition for 'test'을 말한다 RuntimeBinderException 얻을. 동일한 코드 내가 호출 라이브러리에 방법을 이동할 때 예상대로 작동합니다.

+1

와우, 이것은 매우 특이합니다. 이 질문은 런타임 예외라는 점을 분명히하기 위해 제목/질문을 약간 편집했습니다. –

+1

콘솔 앱과 클래스 라이브러리 (.NET 4를 대상으로하고 있으며 둘 다'Microsoft.CSharp.dll'을 참조)로 확인했습니다. 표시된 OP와 마찬가지로, 콘솔 응용 프로그램에서 직접 메서드를 호출 할 때 제대로 작동합니다. 그러나 라이브러리에서 정확한 동일한 코드를 사용하면 예외가 발생합니다. * 페이징 @EricLippert! * –

답변

4

익명 유형은 공개되지 않으며 dynamic은 내부/개인용으로 침입하여 사용할 수 있음을 의미하지 않습니다. 그러나 반사는한다.

당신은 다른 어셈블리 속성을 사용하여 내부 형식을 사용할 수 있습니다 : 완전히 동적를 통해 익명 형식을 사용하여 문제를 해결

// specified in assembly, defining MyLibrary1 class 
[assembly: InternalsVisibleTo("Assembly, where you call MyLibrary1.GetObjects()")] 

합니다.

모두 지정된 어셈블리에서 액세스 할 수 있음을 의미합니다.

+0

이 답변을 확인하십시오. 어셈블리를 통해 도메인 엔터티를 이동하는 표준 방법을 제안합니다. http://stackoverflow.com/a/2630439/739558 –

0

내가 어디에 확실하지 않다

이 추가 정보를 포함하려면

콘솔 앱 및 클래스 라이브러리 (.NET 4를 타겟팅)와 모두 Microsoft.CSharp.dll을 참조하여 확인했습니다. 반환 된 결과를 비교하고 있습니다. 동일한 콘솔 앱의 함수에 의해 라이브러리에서 반환 된 함수로 전달됩니다.

d.GetType().GetProperties()을 호출하면 둘 다 정의한 단일 속성 test이 표시됩니다.

은 당연히 다음,이 둘 다 작동 :
static string GetStringPropertyValue(dynamic d, string propertyName) 
    { 
     Type t = d.GetType(); 

     return t.GetProperty(propertyName).GetValue(d, null); 
    } 

그래서 나는 아주 작동하지만, 단순히 .test 속성을 점점 그들 모두를 위해 작동하지 않는 이유에 어리둥절하고있다.

관련 문제