.net 中的 Automapper 映射预定义值

Automapper map predefined value in .net

我正在尝试使用 .NET 将字符串值字段从 MongoDB 映射到 VisualStudio 中的整数。这些字段具有少数已知值之一,如“行人”、“自行车”、“汽车”。我如何检查这些值并将它们映射为由“0”、“1”、“2”表示?我知道 automapper 的基础知识,但我找不到如何执行此操作。 我将它们作为 List<> 获取,它们需要保留为 List<>。

使用:

MongoDB 文档示例:

{
  "Street" : "Oak",
  "Object" : "pedestrian",
  "Id" : "046b6c7f-0b8a-43b9-b35d-6489e6daee91",
  "City" : "NY",
  "Direction" : 0
}

读取行:

public class Stuff
{
    [BsonElement("_id")]
    public ObjectId Id { get; set; }
    public List<MyDocument> MyDocuments { get; set; }
}

...

var client = new MongoClient();
var database = client.GetDatabase("test");
var collection = database.GetCollection<Stuff>("alma");
var rows = (await collection.FindAsync(FilterDefinition<Stuff>.Empty)).ToList();

选项 1:

您不需要为此使用 Automapper,只要选项名称匹配,MongoDB 驱动程序就会转换枚举。

[BsonNoId]
public class MyDocument
{
    public string Id { get; set; }
    public string Street { get; set; }
    public ObjectEnum Object { get; set; }
    public string City { get; set; }
    public int Direction { get; set; }
}

public enum ObjectEnum
{
    None = 0,
    pedestrian = 1,
    bicycle = 2,
    car = 3
}

...

foreach (var row in rows)
{
    // use the enum, or if you need the associated number just use int cast
    int myNumberRepresentation = (int)row.MyDocuments[0].Object;
}

选项 2:

编写自定义序列化程序,您的 return 类型可以是您喜欢的任何类型:

public enum ObjectEnum
{
    None = 0,
    // notice the upper case
    Pedestrian = 1,
    Bicycle = 2,
    Car = 3
}

[BsonNoId]
public class MyDocument
{
    public string Id { get; set; }
    public string Street { get; set; }
    [BsonSerializer(typeof(CustomObjectSerializer))]
    public ObjectEnum Object { get; set; }
    public string City { get; set; }
    public int Direction { get; set; }
}

public class CustomObjectSerializer: SerializerBase<ObjectEnum>
{
    public override ObjectEnum Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
    {
        var s = context.Reader.ReadString();
        switch (s)
        {
            case "pedestrian":
                return ObjectEnum.Pedestrian;
            case "bicycle":
                return ObjectEnum.Bicycle;
            case "car":
                return ObjectEnum.Car;
            default:
                return ObjectEnum.None;
        }
    }

    public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, ObjectEnum value)
    {
        string ret = "";
        switch (value)
        {
            case ObjectEnum.Pedestrian:
                ret = "pedestrian";
                break;
            case ObjectEnum.Bicycle:
                ret = "bicycle";
                break;
            case ObjectEnum.Car:
                ret = "car";
                break;
        }
        context.Writer.WriteString(ret);
    }
}