2015-02-06 2 views
0

내부적으로는 사전이지만 사용자 정의 동적 개체는 컴파일 타임 속성 인 것처럼 값에 액세스 할 수 있습니다.동적 개체에 대한 메서드 멤버 액세스는 TryGetMember를 호출합니다.

그냥이 (더 이하)이다 :

public class Dummy : DynamicObject, IEnumerable<KeyValuePair<string, object>> 
{ 
    private readonly Dictionary<string, object> _values... 

    public override bool TryGetMember(GetMemberBinder binder, out object result) 
    { 
     result = _values[binder.Name]; 
     return true; 
    } 
    ... 

설정 및 고급 '속성'작품지고, 그러나 나의 목적은 기술적으로 IEnumerable<'1>를 구현하기 때문에, 나는 그것을 IEnumerable<'1>에서 메소드를 호출하고 싶습니다.

그러나 내가 전화 할 때마다.

The key 'Count()' was not present in the dictionary. 

이 주위에 얻을 수있는 방법이 있나요 : Count()TryGetMember는 이해가되지 않습니다 물론 어떤 호출됩니다?

+0

문제점을 복제 할 수 없습니다. 'Count() '를 호출하는 방법을 보여줄 수 있습니까? –

+0

또한 'Count'는'IEnumerable'의 메소드가 아닙니다. 컴파일러가 정적 메소드 인'Enumerable.Count'에 대한 호출로 변환하는 _extension 메소드입니다. –

답변

0

일반 구문을 사용하여 동적 개체에 확장 메서드를 사용할 수 없습니다. 그래도 Enumerable.Count(dummyInstance);을 사용할 수는 있지만 내가 원하는 것은 이것이 아닌지 의심 스럽다.

자세한 내용은 [Extension method and dynamic object을 참조하십시오.

+0

정확하게 이해할 수 있을지 확실하지 않습니다. 확장 메서드는 멤버가 첫 번째 매개 변수로 호출되는 정적 메서드 호출로 변환되는 구문 설탕이라고 생각했습니다. 그래서 list.Count()는 컴파일 후 Enumerator.Count (list)가됩니다. 그래서이 인스턴스가 동적이거나 객체가되는 것과 아무런 관련이 없어야합니다. – xvdiff

+0

예, 정확하게는 구문적인 설탕입니다. 그것은 컴파일 시간에 완료되었음을 의미합니다. 컴파일러가 Dummy 클래스를 인스턴스화하고 있으므로 컴파일하는 동안 동적 객체를 IEnumerable로 처리해야한다는 것을 컴파일러에서 알아야하지만 실제로는 그렇게하지 않으므로 호출 할 정적 메서드를 알지 못합니다. 말이 돼? – Jessica

관련 문제