

前提条件としてXamarin.formsでSQLITEのパッケージsqlite-net-pclを使える状態にしています

同じような構造体やクラスのメンバ変数を持っているクラスを操作するのにテンプレートが使えないのかなと思って試しているのですが  
テンプレートの使い方がわからないです

やりたい事としては、同じカラム名のテーブルを取得するのに似たような書き方が連続するので  
まとめて同じ関数に出来ないかと思ったのですが・・・

下のコードの中の  
_dbCon.Table()  
と言うのが、クラスを指定すると[Table]プロパティに指定されたテーブルから、  
データを取得し戻り値にデータを詰め込むメソッドです

一番下に上手く行くコードを載せたのですが、これをテンプレートにする方法が知りたいです  
確かにメンバ変数の有無なんて事前にわからないし、  
型を直接指定する関数に型の確定しないうちに渡したり、  
nullが渡せるかわからないのにちょっと乱暴かもしれないですが  
そもそもTable関数自体がテンプレートで作られてそうですし  
何かいい書き方はないでしょうか

最終的にはこんな感じで出来上がった関数を使用したいです  
**C_1 c1 = getMstLed(0);**

上手く行かないコード

[code]

    [Table("テーブル1")]
    public class C_1
    {
        [Indexed(Name = "keyC1", Order = 1, Unique = true)]
        public int Idx { get; set; } = 0;
        [Indexed(Name = "keyC1", Order = 2, Unique = true)]
        public int LedNo { get; set; } = 1;
        //メンバ変数色々・・・・
    }
    
    [Table("テーブル2")]
    public class C_2
    {
        [Indexed(Name = "keyC2", Order = 1, Unique = true)]
        public int Idx { get; set; } = 0;
        [Indexed(Name = "keyC2", Order = 2, Unique = true)]
        public int LedNo { get; set; } = 1;
        //メンバ変数色々・・・・
    }
    
    以下、C_3,C_4・・・・・と続く
    
    
    /// <summary>データベースオブジェクト</summary>
    private SQLiteConnection _dbCon = new SQLiteConnection("xxx/data.db3");
    
    /// <summary>データ取得</summary>
    public T getMstLed<T>(int index = 0) 
    {
        var d = _dbCon.Table<T>().Where(x => x.Idx == index);   //Table<T>に対してのエラー　　　パブリック パラメーターなしのコンストラクターを持つ非抽象型でなければなりません
                                    //x.Idxに対してのエラー     'T' に 'Idx' の定義が含まれておらず、型 'T' の最初の引数を受け付けるアクセス可能な拡張メソッド 'Idx' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足していないことを確認してください
    
        if (d.Count() != 0)
        {
            return d.FirstOrDefault();
        }
        else
        {
            return null;                    //Null 非許容の値型である可能性があるため、Null を型パラメーター 'T' に変換できません。'default(T)' を使用してください。
    
        }
    }
    
    
[/code]

上手く行くコード

[code]

    public C_1 getMasterC1(int index = 0)
    {
        var d = _dbCon.Table<C_1>().Where(x => x.Idx == index);
    
        if (d.Count() != 0)
        {
            return d.FirstOrDefault();
        }
        else
        {
            return null;
        }
    }
    
[/code]


CC BY-SA 4.0
2023-01-04T13:22:34.873
93186
2023-01-04T14:00:53.157
2023-01-04T14:00:53.157
3060
10098
question
c# sqlite
Xamarin(C#)でのテンプレートの使い方(データベースから取得したデータの格納について)