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

另一种选择是着眼于使用 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 回答