Вы используете неправильную аннотацию @SessionScoped
. Вы используете один из CDI, в то время как вы зарегистрировали компонент с аннотацией JSF @ManagedBean
вместо аннотации CDI @Named
.
Заменить импорт CDI @SessionScoped
import javax.enterprise.context.SessionScoped;
с помощью JSF @SessionScoped
import
import javax.faces.bean.SessionScoped;
В случае ExpandoObject класс ExpandoObject фактически реализует IDictionary
для своих свойств, поэтому решение будет таким тривиально, как приведение:
IDictionary<string, object> propertyValues = (IDictionary<string, object>)s;
Обратите внимание, что это не будет работать для обычных динамических объектов. В этих случаях вам нужно будет перейти к DLR через IDynamicMetaObjectProvider.
Необходимо рассмотреть несколько сценариев. Прежде всего, вам нужно проверить тип вашего объекта. Для этого вы можете просто вызвать 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, и проигнорировать (или выбросить исключение) для остальных.