Quasar/Quasar.Common/Messages/TypeRegistry.cs

50 lines
1.6 KiB
C#

using ProtoBuf.Meta;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Quasar.Common.Messages
{
public static class TypeRegistry
{
/// <summary>
/// The internal index of the message type.
/// </summary>
private static int _typeIndex;
/// <summary>
/// Adds a Type to the serializer so a message can be properly serialized.
/// </summary>
/// <param name="parent">The parent type, i.e.: IMessage</param>
/// <param name="type">Type to be added</param>
public static void AddTypeToSerializer(Type parent, Type type)
{
if (type == null || parent == null)
throw new ArgumentNullException();
bool isAlreadyAdded = RuntimeTypeModel.Default[parent].GetSubtypes().Any(subType => subType.DerivedType.Type == type);
if (!isAlreadyAdded)
RuntimeTypeModel.Default[parent].AddSubType(++_typeIndex, type);
}
/// <summary>
/// Adds Types to the serializer.
/// </summary>
/// <param name="parent">The parent type, i.e.: IMessage</param>
/// <param name="types">Types to add.</param>
public static void AddTypesToSerializer(Type parent, params Type[] types)
{
foreach (Type type in types)
AddTypeToSerializer(parent, type);
}
public static IEnumerable<Type> GetPacketTypes(Type type)
{
return AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(s => s.GetTypes())
.Where(p => type.IsAssignableFrom(p) && !p.IsInterface);
}
}
}