Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用附加属性和方法扩展C中的DataRow和DataTable?_C#_Ado.net_Datatable_Extend_Datarow - Fatal编程技术网

C# 如何使用附加属性和方法扩展C中的DataRow和DataTable?

C# 如何使用附加属性和方法扩展C中的DataRow和DataTable?,c#,ado.net,datatable,extend,datarow,C#,Ado.net,Datatable,Extend,Datarow,我想创建一个自定义数据行,它将有一个名为IsCheapest的属性 public class RateDataRow : DataRow { protected internal RateDataRow(DataRowBuilder builder) : base(builder) { } public bool IsCheapest { get; set ;} } 我想要一个新的DataTable,它只包含***RateDataRow***,这样.NewDa

我想创建一个自定义数据行,它将有一个名为IsCheapest的属性

public class RateDataRow : DataRow
{
    protected internal RateDataRow(DataRowBuilder builder) : base(builder)
    {
    }

    public bool IsCheapest { get; set ;}
}
我想要一个新的DataTable,它只包含***RateDataRow***,这样.NewDataRow将RateDataRow实例作为新行返回

扩展DataTable的类的实现应该是什么


谢谢,

从您的问题来看,不清楚您是否熟悉类型化数据集。它们基本上就是你想要的

您可以使用内置向导基于XSD创建类型化数据集,并且XSD是从Db模式中提取的。在WinForms项目中,选择AddDataSource并按照以下步骤操作

即使您不想使用该模型,也可以从属性、分部类等的代码中借用


明智的做法是要么使用该模型,要么离它很近。

DataTable公开一个GetRowType虚拟方法,在派生类中重写它。任何添加错误类型行的尝试都将引发异常:

class Program
{
    static void Main(string[] args)
    {
        MyDataTable t = new MyDataTable();
        t.Rows.Add(t.NewRow()); // <-- Exception here, wrong type (base doesn't count).
    }
}

public class MyDataTable : DataTable
{
    public MyDataTable()
        : base()
    { }

    protected override Type GetRowType()
    {
        return typeof(MyDataRow);
    }
}

public class MyDataRow : DataRow
{
    public MyDataRow()
        : base(null)
    { }
}

我知道这是一个老帖子,但我不能让上面的例子工作。我有一个类似的问题,所以我渴望找到一个解决方案。经过一番研究,我发现以下方法可行:

class Program
{
    static void Main(string[] args)
    {
        MyDataTable t1 = new MyDataTable();

        t1.Columns.Add(new DataColumn("Name", typeof(string)));
        t1.Columns.Add(new DataColumn("DateOfBirth", typeof(DateTime)));

        MyDataRow r1 = t1.NewRow() as MyDataRow;
        r1["Name"] = "Bob";
        r1["DateOfBirth"] = new DateTime(1970, 5, 12);
        t1.Rows.Add(r1);
    }
}

[Serializable]
public class MyDataTable : DataTable
{
    public MyDataTable()
        : base()
    {
    }

    public MyDataTable(string tableName)
        : base(tableName)
    {
    }

    public MyDataTable(string tableName, string tableNamespace)
        : base(tableName, tableNamespace)
    {
    }

    /// <summary>
    /// Needs using System.Runtime.Serialization;
    /// </summary>
    public MyDataTable(SerializationInfo info, StreamingContext context)
        : base(info, context)
    {
    }

    protected override Type GetRowType()
    {
        return typeof(MyDataRow);
    }

    protected override DataRow NewRowFromBuilder(DataRowBuilder builder)
    {
        return new MyDataRow(builder);
    }
}

[Serializable]
public class MyDataRow : DataRow
{
    public bool MyPropertyThatIdicatesSomething { get; private set; }

    public MyDataRow()
        : base(null)
    {
    }

    public MyDataRow(DataRowBuilder builder)
        : base(builder)
    {
    }
}

很抱歉,这不是问题的答案,我知道已经晚了,但这是人们在google上找到的第一个与主题相关的条目。这是正确的方式,但需要第二个构造函数,至少在.Net Core 3.1中,这在NewRow是失败的。检查加文·萨瑟兰的答案。