Я работаю над пользовательским ProtoBufFormatter (: MediaTypeFormatter), который способен на лету регистрировать собственные типы в RuntimeTypeModel, используемой для сериализации / десериализации.
Чтобы уменьшить необходимость использования блоков try {} catch {}, было бы здорово отфильтровать уже поддерживаемые типы перед их добавлением в RuntimeTypeModel. Readme предлагает только «расплывчатые» типы списков, которые поддерживаются по умолчанию, а метод Model.GetTypes () возвращает только список типов, которые вручную добавляются в текущую модель.
Readme: https://github.com/mgravell/protobuf-net
Я использую protobuf-net 2.4.0
Поэтому мне интересно, есть ли какой-нибудь простой способ проверить, поддерживается ли тип текущей RuntimeTypeModel?
В настоящее время я использую что-то вроде этого для предварительной фильтрации типов:
private bool IsSimpleType(Type type)
{
return
type.IsPrimitive ||
_additionalSimpleTypes.Contains(type) ||
Convert.GetTypeCode(type) != TypeCode.Object ||
(type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>) && IsSimpleType(type.GetGenericArguments()[0]));
}
private Type[] _additionalSimpleTypes = new Type[]
{
typeof(Enum),
typeof(String),
typeof(String[]),
typeof(Decimal),
typeof(DateTime),
typeof(DateTimeOffset),
typeof(TimeSpan),
typeof(Guid),
typeof(Uri),
typeof(Byte),
typeof(Byte[]),
typeof(Char),
typeof(Boolean),
typeof(Object),
typeof(Version)
};
private Type[] _listTypes = new Type[]
{
typeof(Enum),
typeof(IEnumerable<>),
typeof(List<>),
typeof(IList<>)
};