1

から派生したクラスがありますDataTable。そのctorにはDataTable、関数の呼び出しから取得したオブジェクトからのすべてのデータが必要です。

これは非常に些細なことのように聞こえますが、理解できないことに驚いています。申し訳ありませんが、私は 12 時間以上連続してコーディングしているため、段階的に廃止されたと思います。

助けていただければ幸いです。

using System.Data;
using Foo.Data;

namespace Foo.BusinessObjects
{
    public class StringTable : DataTable
    {
        public StringTable() : base()
        {
            var sql = "SELECT * FROM FooBar";


            // I know that that's not a legal C# statement but 
            // if it were, I'd want to do the equivalent of the following:

            this = Database.DefaultDatabase.GetDataTable(sql);


        }
    }
}

メソッドがオブジェクトGetDataTableを返す場所。System.Data.DataTableその署名は次のとおりです。

public DataTable GetDataTable(string sql, params SqlParameter[] parameters)
{
   DataSet dataset;

   return ((dataset = GetDataSetInternal(sql, false, parameters)) == null ? 
            null : dataset.Tables[0]);
}
4

2 に答える 2

2

派生クラスのコンストラクターで以下の行を置き換えることができます

this = Database.DefaultDatabase.GetDataTable(sql);

DataTable dtResult = Database.DefaultDatabase.GetDataTable(sql);
this.Merge(dtResult);
于 2013-09-13T09:25:37.310 に答える
1

この種のことはコンストラクターでは実行できません。継承よりも構成を優先し、StringTable クラスを保持することができます。

public class StringTable
{
    private DataTable dataTable;

    public StringTable()
    {
        var sql = "SELECT * FROM FooBar";


        // I know that that's not a legal C# statement but 
        // if it were, I'd want to do the equivalent of the following:

        dataTable = Database.DefaultDatabase.GetDataTable(sql);
    }
}

もう 1 つのオプションは、DataTable をサブクラス化するのではなく、DataTable で動作するファクトリ パターンを検討することです。これらの線に沿った何か。継承は、ポリモーフィックな方法で動作できる場合にのみ、実際に利益をもたらします。そうでなければ、あなたが何かを得るとは思えません。

public class DataTableFactory
{
    public DataTable CreateStringTable()
    {
        var sql = "SELECT * FROM FooBar";
        DataTable dataTable = new DataTable();

        return Database.DefaultDatabase.GetDataTable(sql);
    }

    public DataTable CreateSomeOtherTable()
    {
       //etc etc
    }
}
于 2013-09-12T21:28:06.120 に答える