.net 中的 Automapper 映射预定义值
Automapper map predefined value in .net
我正在尝试使用 .NET 将字符串值字段从 MongoDB 映射到 VisualStudio 中的整数。这些字段具有少数已知值之一,如“行人”、“自行车”、“汽车”。我如何检查这些值并将它们映射为由“0”、“1”、“2”表示?我知道 automapper 的基础知识,但我找不到如何执行此操作。
我将它们作为 List<> 获取,它们需要保留为 List<>。
使用:
- VS 19
- Automapper v8
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);
}
}
我正在尝试使用 .NET 将字符串值字段从 MongoDB 映射到 VisualStudio 中的整数。这些字段具有少数已知值之一,如“行人”、“自行车”、“汽车”。我如何检查这些值并将它们映射为由“0”、“1”、“2”表示?我知道 automapper 的基础知识,但我找不到如何执行此操作。 我将它们作为 List<> 获取,它们需要保留为 List<>。
使用:
- VS 19
- Automapper v8
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);
}
}