2

SQLite.Net Extensions の同じ親クラスから継承するさまざまなクラス タイプのコレクションを持つ方法はありますか? 理想的には、インターフェイスまたは抽象クラスに準拠するオブジェクトの配列が必要ですが、標準クラスの子型を機能させることさえできません。

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 で継承を機能させる方法はありますか?

乾杯。

4

1 に答える 1

4

GetWithChildren を使用して ActivityCategory オブジェクトを取得すると、内部的に sqlite-net はリフレクションを使用して呼び出しnew ActivateCategory()、次にnew SomeAbstractClass()それぞれの子に対して呼び出します。そのため、sqlite-net ライブラリのすべてのジェネリックには制約がありますwhere T : new()。これが、クラスが抽象である場合に空の配列を取得する理由です。ライブラリによってインスタンス化することはできません。同じ配列内に異なる型のインスタンスを格納したい場合、sqlite-net が毎回どの型を使用すべきかを推測することはできません。もちろん、アプリケーションのロジックはわかりませんが、sqlite-net 拡張機能を使用せずに、手動でクエリを作成することは避けられないと思います。たとえば、基本クラスが車両で、車とトラックが派生クラスの場合、次を使用できます。

    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);

次に、2 つのリストを車両の 1 つのリストに結合し、このリストを親インスタンス (例では ActivityCategory) に追加できます。

于 2015-05-05T13:15:59.647 に答える