Я определяю com-объект как динамический тип в c #. Я могу вызывать методы довольно легко.Однако, когда я пытаюсь получить доступ к свойству того же объекта, я получаю недопустимое исключение приведения.
Рассматриваемый объект - это массив, переданный в управляемый код из JavaScript, и я хочу получить его свойство lengthкак int.
Я знаю, что мне не хватает чего-то странного, потому что я не получаю исключение «не содержит определения», и я могу легко получить доступ к свойству, используя отражение / InvokeMember.
Почемуя не могу преобразовать свойство длины динамического типа в целое число?
Например
Это терпит неудачу
dynamic com = comObject;
int i = com.length; // RTBE here.
ЭтоРаботы
Type type = comObject.GetType();
int i = (int)type.InvokeMember("length", BindingFlags.GetProperty, null, comObject, null);
* Обновление *
После многих испытаний я сузил эту странность до случаев многомерных массивов.Рассматриваемый объект com - это параметр, переданный из HTML-документа в управляемый код.Для всех намерений и целей объект иногда выглядит следующим образом в JavaScript.
var x = ["a1", "a2", "a3"];
Когда такой массив поступает в управляемый код, я могу получить длину AOK, используя тип dynamic.(т.е. первый пример здесь, который терпит неудачу, фактически работает).Однако, если это многомерный массив, такой как следующая структура в JavaScript.
var y = [["b1", "b2", "b3"], "a2", "a3"];
Тогда я получаю сообщение об ошибке при попытке динамического доступа к его свойству длины.Обратите внимание, что я все еще могу получить доступ к длине через отражение в этом случае.Мне кажется, что по какой-то причине свойство length не отображается правильно, когда многомерный массив используется в качестве dynmaic типа ...
В моем случае, что я сделал, чтобы решить (!?) этодобавьте свойство 'length_' в массив следующим образом, прежде чем передавать его.
var y = [["b1", "b2", "b3"], "a2", "a3"];
y.length_ = y.length;
Теперь в управляемом коде я могу получить доступ к этому свойству, как и ожидалось, без ошибок.Далеко от идеала, но, кажется, работает ...
dynamic com = comObject;
int i = com.length_; // 3!
Дальнейшее обновление
Хорошо, так что кажется, что, как и свойство length, индекс объектов теряетсяк динамическому типу, а также.Опять же, это доступно через отражение, хотя ...
Fails
dynamic com = comObject; // js array i.e. var x = [1, 2];
int i = com[0]; // MissingMemberException - Error while invoking [PROPERTYGET, DISPID(0)].
int i = com["0"]; // MissingMemberException - Error while invoking [PROPERTYGET, DISPID(0)].
Работает
Type type = comObject.GetType();
int i = (int)type.InvokeMember("0", BindingFlags.GetProperty, null, comObject, null); // 1