Если значение атрибута - просто строка, я предполагаю, что у вас уже есть какой-то способ выяснить, что строка идентифицирует значение из определенного перечисления. В вашем примере это жестко запрограммировано, поэтому я не уверен, хотите ли вы этого или хотите изменить.
Предполагая, что вы знаете, что это перечисление, и знаете, какое перечисление, вы уже знаете, как получить объект, содержащий коробочное значение правильного типа enum
, как в вашем фрагменте.
Теперь, если я предполагаю, что EnumValue<T>
имеет конструктор, который принимает T
.
Type genericType = typeof(EnumValue<>);
Type concreteType = genericType.MakeGenericType(typeof(JustificationValues));
Теперь concreteType
- это тип EnumValue<JustificationValues>
.
Отсюда вы можете получить конструктор, который, надо надеяться, принимает параметр JustificationValues
и Invoke
его.
Обновление
Ааа, я вижу, что вы делаете сейчас. Вы используете имя атрибута XML, чтобы выбрать свойство C #. Вы должны быть в состоянии определить, относится ли это свойство к типу EnumValue<T>
и выяснить, что такое T
.
PropertyInfo p = // ... get property info
Type t = p.GetType();
if (t.IsGenericType &&
t.GetGenericTypeDefinition == typeof(EnumValue<>))
{
Type e = t.GetGenericArguments()[0]; // get first (and only) type arg
// e is the enum type...
Дайте этому попытку.