【发布时间】:2012-11-05 22:04:00
【问题描述】:
我有一个没有键、顺序或其他明显索引的对象集合。
我希望将有关每个对象的数据存储在 DataTable 中。我认为这样做的一种优雅方法是将引用存储在所有者列中,并使该列类型为typeof(MyClass)。
但是,当我在实践中尝试这样做时,它不起作用(它说主键冲突)。事实证明,将实例放入行字段只是将“MyProgram.MyClass”写入该字段 - 可能是 toString 的输出,即使该行的类型应该是 MyClass 而不是 string。
这里是一些在 LINQPad 中工作的示例代码:
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 {
}
我该怎么做才能解决这个问题?我是否必须在MyClass 中创建一个id 字段,然后使用id 填写所有者列,然后确保每个对象在自己创建时收到唯一的id?
【问题讨论】:
-
您确定代码不起作用吗?查看 .NET 代码,没有理由不这样做。
row["Owner"].GetType()的输出是什么? -
@Knaģis 这是
typeof (MyClass)。此外,它会在 LinqPad 中引发异常,除非我也错误地编译了 C# 代码。 -
好的,所以要求是使用 MyClass 作为 DataTable 的主键?
-
@Knaģis 我想是的。我试图使用对
MyClass实例的引用作为键,这样就不能有两行指向同一个对象。 -
添加了一个新答案,描述了使用
MyClass作为主键所需的条件。
标签: c# ado.net reference datatable