Поддерживает ли ExpandoObject в C # 4.0 прототипное наследование?
Прежде всего, обратите внимание, что класс ExpandoObject не имеет ничего общего с C # 4.0. Команда C # не проектировала и не реализовала этот объект. C # 4.0 и класс ExpandoObject просто поставляются с последней версией .NET.
Чтобы ответить на ваш вопрос, я отсылаю вас к документации для ExpandoObject, в которой четко указано:
Класс ExpandoObject является реализацией концепции динамического объекта, которая позволяет получать, устанавливать и вызывать члены. Если вы хотите определить типы, которые имеют собственную семантику динамической отправки, используйте класс DynamicObject.
Как указано в документации, если вы хотите, чтобы пользовательская семантика отправки была выше простого вызова членов, используйте класс DynamicObject.
Если нет, то почему бы и нет? это было задумано?
Кто-то может захотеть объект расширения, но этот человек может не хотеть и не нуждаться в наследовании прототипа. Объекты Expando логически не требуют какой-либо формы наследования.
как это можно реализовать?
Использовать объект DynamicObject. Напишите свой собственный механизм наследования прототипов.
Если да, как это работает, и есть ли различия в том, как это работает в Javascript?
Если вы пытаетесь написать свое собственное наследование прототипа, точно такое же, как JScript, я рекомендую вам внимательно прочитать спецификацию ECMAScript * * * * * * *. Наследование прототипа выглядит просто, но есть тонкости, которые большинство людей ошибаются. Например, даже эксперты JScript часто неправильно понимают эту маленькую головоломку. Что печатает этот код JScript?
var Animal = new Object();
function Reptile() { }
Reptile.prototype = Animal;
var lizard = new Reptile();
print(lizard instanceof Reptile); // this is true
print(lizard.constructor == Reptile); // is this true or false? explain your answer!
Наследование прототипов не всегда работает так, как вы думаете! Для объяснения того, что это печатает и почему, см. мою статью на эту тему .