Как я отражаю над членами динамического объекта?

Вы используете неправильную аннотацию @SessionScoped. Вы используете один из CDI, в то время как вы зарегистрировали компонент с аннотацией JSF @ManagedBean вместо аннотации CDI @Named .

Заменить импорт CDI @SessionScoped

import javax.enterprise.context.SessionScoped;

с помощью JSF @SessionScoped import

import javax.faces.bean.SessionScoped;

См. Также:

122
задан abatishchev 31 March 2016 в 07:28
поделиться

2 ответа

В случае ExpandoObject класс ExpandoObject фактически реализует IDictionary для своих свойств, поэтому решение будет таким тривиально, как приведение:

IDictionary<string, object> propertyValues = (IDictionary<string, object>)s;

Обратите внимание, что это не будет работать для обычных динамических объектов. В этих случаях вам нужно будет перейти к DLR через IDynamicMetaObjectProvider.

100
ответ дан 24 November 2019 в 01:17
поделиться

Необходимо рассмотреть несколько сценариев. Прежде всего, вам нужно проверить тип вашего объекта. Для этого вы можете просто вызвать GetType (). Если тип не реализует IDynamicMetaObjectProvider, вы можете использовать отражение так же, как и для любого другого объекта. Примерно так:

var propertyInfo = test.GetType().GetProperties();

Однако для реализаций IDynamicMetaObjectProvider простое отражение не работает. В принципе, об этом объекте нужно знать больше. Если это ExpandoObject (который является одной из реализаций IDynamicMetaObjectProvider), вы можете использовать ответ, предоставленный itowlson. ExpandoObject сохраняет свои свойства в словаре, и вы можете просто преобразовать свой динамический объект в словарь.

Если это DynamicObject (другая реализация IDynamicMetaObjectProvider), вам необходимо использовать любые методы, которые предоставляет этот DynamicObject. DynamicObject не обязательно где-либо «хранить» свой список свойств. Например, он может сделать что-то вроде этого (я повторно использую пример из моего сообщения в блоге ):

public class SampleObject : DynamicObject
{
    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        result = binder.Name;
        return true;
    }
}

В этом случае, когда вы пытаетесь получить доступ к свойству (с любым заданным именем), объект просто возвращает имя свойства в виде строки.

dynamic obj = new SampleObject();
Console.WriteLine(obj.SampleProperty);
//Prints "SampleProperty".

Итак, вам не о чем размышлять - этот объект не имеет никаких свойств, и в то же время все допустимые имена свойств будут работать.

Я бы сказал, что для реализаций IDynamicMetaObjectProvider вам необходимо отфильтровать известные реализации, в которых вы можете получить список свойств, таких как ExpandoObject, и проигнорировать (или выбросить исключение) для остальных.

57
ответ дан 24 November 2019 в 01:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: