C# 如何使用附加属性和方法扩展C中的DataRow和DataTable?
我想创建一个自定义数据行,它将有一个名为IsCheapest的属性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
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是失败的。检查加文·萨瑟兰的答案。