- Home /
 
 
               Question by 
               JeffBert · Mar 12, 2021 at 07:17 PM · 
                custom editorgenerics  
              
 
              Custom editor: Drawing generic properties
I want to display a generic property in the editor, but I can't figure out how to do this without implementing a bunch of concrete classes for each of my generic implementations.
 public abstract class ComponentModel<T> : ScriptableObject
     where T : Component
 {
     public T Data { get; set; }
 }
 
               I'm trying to draw the Data field in the inspector. My attempt:
 [CustomEditor(typeof(ComponentModel<>), true)]
 public class ComponentModelEditor : UnityEditor.Editor
 {
     public override void OnInspectorGUI()
     {
         base.OnInspectorGUI();
         var component = (ComponentModel<Component>)target;
         EditorGUILayout.ObjectField(component.Data, typeof(Component), false);
     }
 }
 
               Isn't working. I don't really know where to start looking to fix this.
               Comment
              
 
               
              Answer by JeffBert · Mar 17, 2021 at 12:07 AM
Fixed this by having my generic class derive from a base class that contains the component. Interface would work too.
 // Base
 public abstract class ComponentModel : ScriptableObject
 {
     public abstract Component Component { get; }
 }
 // Generic component
 public class ComponentModel<T> : ComponentModel
 [...]
 // Editor
 [CustomEditor(typeof(ComponentModel), true)]
 public class ComponentModelEditor : UnityEditor.Editor
 {
     public override void OnInspectorGUI()
     {
         base.OnInspectorGUI();
         
         GUI.enabled = false;
         Component component = ((ComponentModel)target).Component;
         EditorGUILayout.ObjectField(component , typeof(Component), false);
         GUI.enabled = true;
     }
 }
 
              Your answer