gpt4 book ai didi

c# - SQLite-Net 扩展中多个(相关)类类型的数组

转载 作者:行者123 更新时间:2023-11-30 20:43:59 24 4
gpt4 key购买 nike

在 SQLite.Net Extensions 中,有没有一种方法可以拥有从同一父类继承的不同类类型的集合?理想情况下,我希望有一组符合接口(interface)或抽象类的对象,但我什至无法让标准类的子类型工作。

public class ActivityCategory
{
[PrimaryKey, AutoIncrement]
public int Id { get; set; }
public string Title { get; set; }
public string Icon { get; set; }
public bool Recommended { get; set; }

[OneToMany(CascadeOperations = CascadeOperation.All)]
public SomeAbstractClass[] multipleTypesAllowed { get; set; }
}

public abstract class SomeAbstractClass
{
[PrimaryKey, AutoIncrement]
public int Id { get; set; }

public string SomeValue { get; set; }

[ForeignKey(typeof(ActivityCategory))]
public int ActivityCategoryId { get; set; }

[ManyToOne(CascadeOperations = CascadeOperation.All)]
public ActivityCategory Category { get; set; }
}

除了 multipleTypesAllowed 的空数组之外,我无法让上面的内容返回任何内容。如果我使父类不抽象并实例化它,它会起作用,但即使是它的子类也不起作用。有什么方法可以让继承与 SQLite.Net 一起工作吗?

干杯。

最佳答案

当您使用 GetWithChildren 获取 ActivityCategory 对象时,sqlite-net 在内部使用反射调用 new ActivateCategory(),然后为每个对象调用 new SomeAbstractClass() children 。这就是为什么 sqlite-net 库中的所有泛型都有约束 where T : new()。这就是当你的类是抽象的时候你得到一个空数组的原因。它只是不能被库实例化。如果你想在同一个数组中存储不同类型的实例,你不能让 sqlite-net 为你猜测它每次应该使用哪种类型。当然,我不知道您的应用程序的逻辑,但我认为您无法避免手动编写查询 - 不使用 sqlite-net 扩展。例如,如果您的基类是 Vehicle,而 Car 和 Truck 是派生类,您可以使用:

    db.CreateTable<Vehicle>();
Car c = new Car();
Truck t = new Truck();
db.Insert(c, typeof(Vehicle));
db.Insert(t, typeof(Vehicle));
...
List<Car> cars = db.Query<Car>("select * from Vehicle where VehicleType = ?", VehicleTypes.Car);
List<Truck> trucks = db.Query<Truck>("select * from Vehicle where VehicleType = ?", VehicleTypes.Truck);

然后您可以将两个列表合并为一个 Vehicle 列表,并将此列表添加到您的父实例(在您的示例中为 ActivityCategory)。

关于c# - SQLite-Net 扩展中多个(相关)类类型的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29972376/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com