private void GetPropertyDrawerType(SerializedProperty property) { if (_genericAttributeDrawerInstance != null) { return; } //Get the second attribute flag try { _genericAttribute = (PropertyAttribute)fieldInfo.GetCustomAttributes(typeof(PropertyAttribute), false) .FirstOrDefault(a => !(a is ConditionalFieldAttribute)); //TODO: wtf man if (_genericAttribute is ContextMenuItemAttribute) { LogWarning("[ConditionalField] does not work with " + _genericAttribute.GetType(), property); return; } if (_genericAttribute is TooltipAttribute) { return; } } catch (Exception e) { LogWarning("Can't find stacked propertyAttribute after ConditionalProperty: " + e, property); return; } //Get the associated attribute drawer try { _genericAttributeDrawerType = _allPropertyDrawerAttributeTypes.First(x => (Type)CustomAttributeData.GetCustomAttributes(x).First().ConstructorArguments.First().Value == _genericAttribute.GetType()); } catch (Exception e) { LogWarning("Can't find property drawer from CustomPropertyAttribute of " + _genericAttribute.GetType() + " : " + e, property); return; } //Create instances of each (including the arguments) try { _genericAttributeDrawerInstance = (PropertyDrawer)Activator.CreateInstance(_genericAttributeDrawerType); //Get arguments IList <CustomAttributeTypedArgument> attributeParams = fieldInfo.GetCustomAttributesData() .First(a => a.AttributeType == _genericAttribute.GetType()).ConstructorArguments; IList <CustomAttributeTypedArgument> unpackedParams = new List <CustomAttributeTypedArgument>(); //Unpack any params object[] args foreach (CustomAttributeTypedArgument singleParam in attributeParams) { if (singleParam.Value.GetType() == typeof(ReadOnlyCollection <CustomAttributeTypedArgument>)) { foreach (CustomAttributeTypedArgument unpackedSingleParam in (ReadOnlyCollection <CustomAttributeTypedArgument>)singleParam.Value) { unpackedParams.Add(unpackedSingleParam); } } else { unpackedParams.Add(singleParam); } } object[] attributeParamsObj = unpackedParams.Select(x => x.Value).ToArray(); if (attributeParamsObj.Any()) { _genericAttribute = (PropertyAttribute)Activator.CreateInstance(_genericAttribute.GetType(), attributeParamsObj); } else { _genericAttribute = (PropertyAttribute)Activator.CreateInstance(_genericAttribute.GetType()); } } catch (Exception e) { LogWarning("No constructor available in " + _genericAttribute.GetType() + " : " + e, property); return; } //Reassign the attribute field in the drawer so it can access the argument values try { var genericDrawerAttributeField = _genericAttributeDrawerType.GetField("m_Attribute", BindingFlags.Instance | BindingFlags.NonPublic); genericDrawerAttributeField.SetValue(_genericAttributeDrawerInstance, _genericAttribute); } catch (Exception e) { LogWarning("Unable to assign attribute to " + _genericAttributeDrawerInstance.GetType() + " : " + e, property); } }