Свойство ExpandoObject не найдено

Вот определение свойства ViewModel.

private List<ExpandoObject> productList;

public List<ExpandoObject> Products {
    get {

        return productList;
    }

    set {

        productList = value;

    }
}

Для выбранного продукта ExpandoObject у меня есть свойство с именем lineNum, которое задается стандартным для ExpandoObjects способом:

product.lineNum = some_integer;

Теперь внутри метода, находящегося внутри другого объекта, у меня есть это. object_passed_in объявляется как Object, и в него передается член productList.

var selectedProduct = object_passed_in as ExpandoObject 
// I have tried this as "dynamic", too

Когда я устанавливаю точку останова и смотрю "selectedProduct.lineNum", часы работают нормально - они показывают правильное значение. Однако...

if (selectedProduct.lineNum == some_comparison_value) {

    // some lines of code
}

выдает ошибку - исключение первого шанса, говорящее мне, что lineNum не является свойством, найденным в ExpandoObject selectedProduct.

Я могу превзойти ExpandoObject в подчинении, приведя его к строке IDictionary‹, object> type, а затем обратившись к свойству следующим образом:

int passed_in_lineNum = (int)selectedProduct["lineNum"]; 

но это полностью противоречит цели использования ExpandoObject!

Что. Являюсь. Я делаю. Неправильный. Здесь???


person Steven C. Britton    schedule 25.09.2014    source источник
comment
Могу я спросить, почему вы используете такую ​​конструкцию? Использование ExpandoObject кажется довольно неприятным запахом кода, а также архитектурным (очевидно, это не применяется, когда вы взаимодействуете с языками DLR).   -  person Machinarius    schedule 26.09.2014
comment
Справедливый вопрос. Я работаю с кучей свойств, которые загружаются в программу из внешнего источника - динамически. Они могут быть такими, какими хочет их видеть пользователь, поэтому мы не знаем, как они называются во время компиляции. . Мы не знаем ни их количества, ни их имен, поэтому ExpandoObject кажется подходящим для этого приложения.   -  person Steven C. Britton    schedule 26.09.2014
comment
@Machinarius - вы бы выбрали другой подход? Если да, то мне интересно...   -  person Steven C. Britton    schedule 26.09.2014
comment
Я бы выбрал старомодное хранилище Key-Value, которое я могу сохранить. Редис может? Предполагая, что определяемые пользователем ключи могут быть хешированы, а их значения являются простыми строками (или могут быть закодированы как таковые), хэш-карта KVP будет быстрее, а намерение будет более ясным, поскольку это их единственная цель.   -  person Machinarius    schedule 26.09.2014
comment
Я должен изучить это; для уверенности. Я не знаю, применимо ли это в данном конкретном случае, мне нужно еще немного покопаться, прежде чем принять решение. Этот вопрос основан только на очень небольшом фрагменте более крупного приложения, большую часть которого я намеренно пропустил. Однако различные другие аспекты этого проекта усложняют проблему. Тем не менее, спасибо за указатель - я обязательно буду следить за ним.   -  person Steven C. Britton    schedule 26.09.2014
comment
Без проблем. Я думаю, что словарь будет быстрее, чем отражение объекта DLR. Возможно, стоит проверить производительность.   -  person Machinarius    schedule 27.09.2014


Ответы (1)


У вас снят флажок «Включить только мой код» в разделе «Инструменты» -> «Параметры» -> «Отладка» -> «Общие»? Поскольку это исключение первого шанса, вполне возможно, что DLR выдает и перехватывает его (я смог воспроизвести это, не установив флажок «Включить только мой код»). Попробуйте игнорировать исключение или установите флажок «Включить только мой код» и посмотрите, работает ли он.

person Tejas Sharma    schedule 25.09.2014
comment
... ааааа, похоже, это исправило; после, конечно, я полностью изменил все ссылки на ExpandoObject в коде. грррр :) - person Steven C. Britton; 26.09.2014