0

我有一个名为“vehicle”的常规 C# 类,具有 Name、NumberPlate、MaxSpeed 等属性。该类的所有数据都存储在 SQLite 数据库中,其中我有一个表“Car”和“Boat”。表列与类属性具有相同的名称(但是,列比类属性多 - 车辆是更通用的抽象)。目前,我必须像这样一个一个地分配查询的结果:

while (await statement.StepAsync())
{
myVehicle.Name = statement.Columns["Name"];
//[...]
myVehicle.MaxSpeed = decimal.TryParse(statement.Columns["MaxSpeed"]);
}

此外,我必须检查是否存在某些列(“Car”和“Boat”有一组不同的列),这比我想要的要多。

我阅读了 EntityFramework 来将我的 db 表映射到我的班级 - 但这似乎有点矫枉过正。我的要求是映射具有相同名称的属性和列并忽略其他所有内容。是否有一种“简单”(开发时间、代码行)的方式将我的表格列映射到我的班级?

谢谢阅读!

4

2 回答 2

0

电话 8 中的限制意味着许多对此的标准答案(“只需使用 {some ORM / micro-ORM}”)将不适用,因为它们不适用于电话 8。您可能可以使用反射很多,但是:反射可能(相对)慢,所以这取决于你将处理多少数据。如果它是偶尔的和轻的:很好,反射掉。

运行时元编程(完整 .NET 中的“dapper”之类的库用来使这些事情变得非常快的技巧)在受限的运行时不可用,所以如果你想避免大量留下构建时元的样板-编程。最简单的是,我想知道您是否可以使用 T4 之类的东西来自动为您创建这些方法作为 C#。还有一些方法可以使用反射发射 API 为电话 8 构建程序集(在构建时),但这是一个非常核心的路线。

我的想法:

  • 如果这里的类型不是很大,只需编写代码
  • 如果您有很多类型,或者您只是喜欢它,请考虑构建时代码生成元编程步骤;您甚至可能会想“嗯,这是我可以向社区提供的东西吗?”
    • 当然,首先要做的是检查这样的东西是否已经存在
于 2013-06-18T09:00:26.777 回答
0

有一个小帮手可能适合您的情况。基本上,它将使用字典并尝试使用反射填充对象属性。不过我没有自己尝试。

您只需执行以下操作:

while (await statement.StepAsync())
{
    myVehicle = DictionaryToObject<Car>(statement.Columns);
}

它可能需要一些进一步的工作才能让它运行,但也许是一个好的开始。

于 2013-06-18T09:03:02.483 回答