为 Class 的实例创建方法

Create Method for instance of Class

我有一个通用的 class 用于 c# 中的字典,但是我想为字典的不同 instances/types 添加 OnBeforeSerialize() 的功能。

我分三种:

SerializableDictionary<Guid, RoomData>
SerializableDictionary<Guid, AssetData>
SerializableDictionary<Guid, SegData>

我需要为每个字典值将此功能添加到 OnBeforeSerialize 到 运行:

房间数据:

    public void GuidToString() {
        roomData.guid = guid.ToString();
        roomData.assetGuidList.Clear();
        roomData.assetGuidList=assetGuidList.Select(g => g.ToString()).ToList();
    }

对于资产数据:

public void GuidToString() {
    assetData.guid = guid.ToString();
    assetData.segGuidArray=segGuidArray.Select(g => g.ToString()).ToArray();
    assetData.roomGuid = roomGuid.ToString();
}

对于 SegData:

public void GuidToString() {
    segData.guid = guid.ToString();
    if (door != null) {
        segData.returnWallGuid = door.returnWall.guid.ToString();
    }
}

如何确保相关的 GuidToString 功能与相应类型的 SerializableDictionary 运行 一致?谢谢大家

-瑞克

这里是 class:

 [Serializable]
 public class SerializableDictionary<TKey, TValue> : Dictionary<TKey, TValue>, ISerializationCallbackReceiver
 {
     [SerializeField]
     private List<TKey> keys = new List<TKey>();

     [SerializeField]
     private List<TValue> values = new List<TValue>();

     // save the dictionary to lists
     public void OnBeforeSerialize()
     {
         keys.Clear();
         values.Clear();
         foreach(KeyValuePair<TKey, TValue> pair in this)
         {
             keys.Add(pair.Key);
             values.Add(pair.Value);
         }
     }

     // load dictionary from lists
     public void OnAfterDeserialize()
     {
         this.Clear();

         if(keys.Count != values.Count)
             throw new System.Exception(string.Format("there are {0} keys and {1} values after deserialization. Make sure that both key and value types are serializable."));

         for(int i = 0; i < keys.Count; i++)
             this.Add(keys[i], values[i]);
     }
 }

创建一个具有 GuidToString 方法的接口:

interface IGuidToStringable {
    void GuidToString();
}

RoomDataAssetDataSegData都实现了接口。

约束TValue成为IGuidToStringable的实施者:

public class SerializableDictionary<TKey, TValue> : Dictionary<TKey, TValue>, ISerializationCallbackReceiver where TValue : IGuidToStringable

现在您可以拨打GuidToString:

 public void OnBeforeSerialize()
 {
     keys.Clear();
     values.Clear();
     foreach(KeyValuePair<TKey, TValue> pair in this)
     {
         pair.Value.GuidToString();
         keys.Add(pair.Key);
         values.Add(pair.Value);
     }
 }

我看到 GuidToString 没有 return 任何东西,但它的名字表明它 return 是一个字符串。您考虑过重命名吗?