Я прочитал исходный код c # SDK v2.7 и обнаружил следующую проблему.
namespace MongoDB.Bson.Serialization.Serializers
{
/// <summary>
/// Represents a serializer for enums.
/// </summary>
/// <typeparam name="TEnum">The type of the enum.</typeparam>
public class EnumSerializer<TEnum> : StructSerializerBase<TEnum>, IRepresentationConfigurable<EnumSerializer<TEnum>> where TEnum : struct
{
......
public override TEnum Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
{
var bsonReader = context.Reader;
var bsonType = bsonReader.GetCurrentBsonType();
switch (bsonType)
{
case BsonType.Int32: return (TEnum)Enum.ToObject(typeof(TEnum), bsonReader.ReadInt32());
case BsonType.Int64: return (TEnum)Enum.ToObject(typeof(TEnum), bsonReader.ReadInt64());
case BsonType.Double: return (TEnum)Enum.ToObject(typeof(TEnum), (long)bsonReader.ReadDouble());
case BsonType.String: return (TEnum)Enum.Parse(typeof(TEnum), bsonReader.ReadString());
default:
throw CreateCannotDeserializeFromBsonTypeException(bsonType);
}
}
......
}
}
В этом методе код
case BsonType.String: return (TEnum)Enum.Parse(typeof(TEnum), bsonReader.ReadString());
вызовет ArgumentException, когдаReadString () возвращает значение, которое не определено в типе TEnum.
Будет ли лучше при подходе ниже десериализовать из строки в Enum?
case BsonType.String:
TEnum result;
Enum.TryParse<TEnum>(bsonReader.ReadString(), out result);
return result;