2013-04-10 2 views
0

Я читал около dynamic и его вклад в развитие языка. DLR управляет любым вызовом члена объекта (dynamic), для этого он использует механизмы отражения. Но я не могу понять поведение типа DyamicObject (внутренне).Как работает C# DynamicObject?

Когда вы унаследовали от DynamicObject вы получите возможность создать что-то вроде существующего ExpandoObject, вам нужно перезаписать TrySetMember, TryGetMember и другие методы. Мой вопрос: когда вы делаете object.method, как это передается TryGetMember нашего класса, на первый взгляд, кажется, что DynamicObject ограничена в DLR, но я сомневаюсь в этом.

+1

Вы пробовали прочитать книгу или какой-нибудь форум, описывающий динамические объекты? Или, по крайней мере, вы задали Google тот же вопрос? –

+0

@OleksandrPshenychnyy i google it, но все результаты, где о функциональности, я ищу вещи позади. В книгах и материалах у меня красный, все объясняют возможности, но ничего не говорят о внутренней реализации. – agarwaen

+1

Я читал об этом в книге Джеффри Рихтера «CLR via C#». Это очень много, чтобы объяснить, и я не уверен, что все это помню - вам лучше это прочитать. Коротко говоря, он компилирует несколько версий кода, который вы пишете с помощью операторов «If», проверяющих результат динамического объекта .GetType(). Если он не может предсказать тип, он использует отражение. –

ответ

1

Ответ на уточненный вопрос в комментарии.

Хотя я не уверен, я полагаю, что TryInvokeMember и т. Д. Просто обертывают над отражением, чтобы преодолеть основную проблему проектирования отражения - он выдает только один тип исключения: TargetInvocationException. Все остальные исключения, включая ваши собственные исключения из методов, которые вы вызываете, завертываются с TargetInvocationException.

динамические переменные не имеют этой проблемы - они генерируют точно такое же подкрепление, которое было выбрано изначально. Хотя в некоторых случаях они по-прежнему используют отражение внутри, они должны развернуть основные исключения. И я считаю, что это цель TryInvokeMember и связанных с ним методов. Кроме того, он позволил разработчикам CLR обрабатывать вызовы с неиспользуемыми членами более подходящим и особым образом.

Смежные вопросы