我试着在Type
这一栏做出 Select ,CloudFileTypes
就是enum
.如果您try 使用Linq方法或MongoDB驱动程序筛选器进行 Select ,则它会将Type
视为一个数字,并且无法找到所需的文件,而在数据库的Type
字段中,我有string
个值.如果我 Select 某个特定的文件并访问类型字段,则它将根据需要返回枚举成员.
如果我误解了,我提前道歉.
代码的问题部分:
public CloudFile GetRoot(User user)
{
var builder = Builders<CloudFile>.Filter;
var query = builder.Eq(e => e.Type, CloudFileTypes.Root);
var root = _fileCollection.Find(query).First();
return root.First();
}
CloudFile
型号:
public class CloudFile
{
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; }
[BsonElement("name")] public string Name { get; set; }
[JsonConverter(typeof(JsonStringEnumConverter))]
[BsonElement("type")] public CloudFileTypes Type { get; set; }
[BsonElement("size")] public int Size { get; set; }
[BsonElement("path")] public string Path { get; set; }
[BsonRepresentation(BsonType.ObjectId)]
[BsonElement("user")] public string User { get; set; }
[BsonRepresentation(BsonType.ObjectId)]
[BsonElement("parent")] public string Parent { get; set; }
[BsonRepresentation(BsonType.ObjectId)]
[BsonElement("childs")] public string[] Childs { get; set; }
}
public enum CloudFileTypes
{
[EnumMember(Value = "root")] Root,
[EnumMember(Value = "folder")] Folder,
[EnumMember(Value = "file")] File,
}
我该如何解决这个问题.我试着在谷歌上搜索了一下,没什么用.
#
public class EnumStringConverter<TEnum> : JsonConverter where TEnum: struct, Enum
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(CloudFileTypes);
}
public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer)
{
if (value is not TEnum @enum)
return;
if (!Attribute.IsDefined(@enum.GetType().GetMember(@enum.ToString()).FirstOrDefault(), typeof(EnumMemberAttribute)))
writer.WriteValue(@enum.ToString());
writer.WriteValue(EnumExtensions.GetEnumMemberValue(@enum));
}
public override object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer)
{
JObject jo = JObject.Load(reader);
var str = jo.ToString();
var obj = EnumExtensions.EnumMemberValueToEnum<CloudFileTypes>(str);
return obj;
}
}