예제 #1
0
        private void addType(List <byte> result, Type type)
        {
            if (type.IsArray)
            {
                result.Add((byte)AdditionalTypeCodes._ArrayTypeCode);
                addType(result, type.GetElementType());
                return;
            }

            if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable <>))
            {
                result.Add((byte)AdditionalTypeCodes._BoxiedTypeCode);
                addType(result, type.GetGenericArguments()[0]);
                return;
            }

            var typeId = Type.GetTypeCode(type);

            if (typeId == TypeCode.Object)
            {
                if (type != typeof(object))
                {
                    if (_types.TryGetId(type, out var id))
                    {
                        typeId = AdditionalTypeCodes._RegisteredTypeCode;
                        result.Add((byte)typeId);
                        addInt32(result, (int)id);
                    }
                    else
                    {
                        typeId = AdditionalTypeCodes._UnregisteredTypeCode;
                        result.Add((byte)typeId);
                        addString(result, type.FullName);
                    }

                    return;
                }
            }

            result.Add((byte)typeId);
        }
예제 #2
0
 public bool TryGetId(Type type, out uint id)
 {
     lock (_sync)
         return(_typeToId.TryGetValue(type, out id) || (_parentMap != null && _parentMap.TryGetId(type, out id)));
 }