X++:
public static System.Object getEnumValue(System.Enum _o)
{
System.Object ret;
System.Reflection.Assembly assembly;
System.Reflection.ConstructorInfo constructorInfo;
System.Type enumType,
enumGenericType,
genericType;
System.Type[] enumTypes;
System.Object[] enumValues;
str enumTypeStr,
enumValueStr,
assemblyStr;
if (! CLRInterop::isNull(_o))
{
try
{
enumValueStr = _o.ToString();
enumType = _o.GetType();
enumTypeStr = enumType.ToString();
assembly = enumType.get_Assembly(); //определяем .net сборку (по ENUM)
assemblyStr = assembly.ToString();
enumGenericType = assembly.GetType (#OpenXmlGenericEnumValue); //тип DocumentFormat.OpenXml.EnumValue`1
assembly = null;
if (CLRInterop::isNull(enumGenericType))
{
enumType = null;
throw error (strFmt(".net сборка '%1'(ENUM '%2') не содержит дженерик-тип %3", assemblyStr, enumTypeStr, #OpenXmlGenericEnumValue));
}
//инициируем массив типов (с единственным элементом = enumType)
enumTypes = new System.Type[1]();
enumTypes.SetValue(enumType, 0);
enumType = null;
genericType = enumGenericType.MakeGenericType (enumTypes); //создаем generic DocumentFormat.OpenXml.EnumValue`1, приведенный к типу enumTypes
enumGenericType = null;
if (CLRInterop::isNull(genericType) || ! genericType.get_IsGenericType())
{
throw error (strFmt("ENUM '%1' не является дженериком", enumTypeStr));
}
constructorInfo = genericType.GetConstructor (enumTypes); //конструктор (для ENUM generic типа)
genericType = null;
enumTypes = null;
//инициируем массив занчений значение ENUM (с единственным элементом= enumValueStr)
enumValues = new System.Object[1]();
enumValues.SetValue (CLRInterop::parseClrEnum(enumTypeStr, enumValueStr), 0);
ret = constructorInfo.Invoke(enumValues); //создаем объект ENUM generic типа (с значением = enumValueStr)
constructorInfo = null;
enumValues = null;
}
catch
{
error (WMSCOMPrint::getClrErrorMessage());
}
}
return ret;
}
Цитата:
- метод создания дженерика еще немного подрихтовал(+ добавил комментарии)