Search Unity

  1. How can our website serve you better? Give us your feedback. Take our survey and let us know.
    Dismiss Notice

SerializedProperty of Generics

Discussion in '2020.1 Beta' started by Araj, Jul 1, 2020.

  1. Araj

    Araj

    Joined:
    Jan 3, 2013
    Posts:
    27
    Hi!

    Finally, it seems that we can create custom inspectors for generic classes in Unity 2020.1.

    I'm trying to create a custom inspector with the UI Toolkit for a GenericDictionary<,>. So far, everything works beautifully. I can create dictionaries with:
    Code (CSharp):
    1. GenericDictionary<string, int> dictionary = new GenericDictionary<string, int>();
    And my custom editor renders it without issues.

    The problem comes when I create a dictionary with a List or an array item as a Key or Value. For example, this:
    Code (CSharp):
    1. GenericDictionary<string, List<int>> dictionary = new GenericDictionary<string, List<int>>();
    Doesn't work.

    Unfortunately, I can't share the full source of the Visual Element, as it's owned by my company, but I can share the piece of the code that actually fails:

    This is part of the GenericDictionary class (i'm just adding a few utility methods and the keys and value lists and that's it):
    Code (CSharp):
    1. [Serializable]
    2.     public class GenericDictionary<TKey, TValue> : IDictionary<TKey, TValue>, ISerializationCallbackReceiver
    3. {
    4.         [SerializeField] List<TKey> keys = new List<TKey>();
    5.         [SerializeField] List<TValue> values = new List<TValue>();
    6.         ...
    7.         ...
    8.         ...
    9. }
    And this is the code that creates the VisualElements to render the dictionary.
    Code (CSharp):
    1. public static VisualElement CreateDictionary(SerializedProperty property, PropertyDrawer drawer)
    2.         {
    3.             if (property != null)
    4.             {
    5.                 var keys = property.FindPropertyRelative("keys");
    6.                 var values = property.FindPropertyRelative("values"); // This returns null if the "values" property is a List.
    7.                 if (keys != null && values != null)
    8.                 {
    9.                     ...
    10.                 }
    11.                 ...
    12.             }
    13.             ...
    14. }
    The "property.FindPropertyRelative" part returns null if the keys or values are Lists or Arrays.

    Do you know how could I fix that?
     
    phobos2077 likes this.
unityunity