使用“this”关键字在DataTable中存储对象的引用

时间:2012-11-05 12:49:34

标签: c# ado.net reference datatable

我有一组没有键或顺序或其他明显索引的对象。

我希望在DataTable中存储有关每个对象的数据。我认为这样做的一种优雅方式是在所有者列中存储引用,并使该列类型为typeof(MyClass)

然而,当我尝试在实践中这样做时,它不起作用(它说主键发生冲突)。事实证明,将实例放入行字段只是将“MyProgram.MyClass”写入字段 - 可能是toString的输出,即使该行的类型应该是MyClass而不是{{1} }}

以下是一些在LINQPad中运行的示例代码:

string

我该怎么做才能解决这个问题?我是否必须在void Main() { // Create a table var table = new DataTable(); var ownerColumn = new DataColumn("Owner", typeof(MyClass)); var primaryKey = new[] { ownerColumn }; table.Columns.AddRange(primaryKey); table.PrimaryKey = primaryKey; table.Columns.Add(new DataColumn("Some Data", typeof(int)) { DefaultValue = 0 }); // Create 2 objects var c1 = new MyClass(); var c2 = new MyClass(); // Store their data in the table var row = table.NewRow(); row["Owner"] = c1; row["Some Data"] = 1; table.Rows.Add(row); row = table.NewRow(); row["Owner"] = c2; row["Some Data"] = 2; table.Rows.Add(row); } // Define other methods and classes here class MyClass { } 中创建id字段,然后使用MyClass填写所有者列,然后确保每个对象在创建时都会收到唯一的id字段?

2 个答案:

答案 0 :(得分:2)

您必须在System.IComparable上实现MyClass(非通用版本)界面,以便DataTable知道如何比较列的值。如果未定义此接口,则代码将依赖于比较object.ToString()结果。

答案 1 :(得分:1)

您可以使用自动增量列:

DataTable dTable = new DataTable();
DataColumn auto = new DataColumn("AutoID", typeof(System.Int32));
dTable.Columns.Add(auto);
auto.AutoIncrement = true;
auto.AutoIncrementSeed = 1;
auto.ReadOnly = true;