我有DataTable
对象包含测试数据:
DataTable testData = new DataTable();
我想将数据分配给与列名相同的变量。我可以这样做:
string foo = testData.Rows[1]["foo"].ToString();
string bar = testData.Rows[1]["bar"].ToString();
或:
string foo = testData.Rows[1][nameof(foo)].ToString();
string bar = testData.Rows[1][nameof(bar)].ToString();
但是,我不想每次调用变量名称,我想使用这样的想法:
string foo = testData.Rows[1][nameof(this)].ToString();
string bar = testData.Rows[1][nameof(this)].ToString();
有可能吗?
答案 0 :(得分:2)
为什么要考虑
string foo = testData.Rows[1][nameof(foo)].ToString();
比我更优雅
string anyName = testData.Rows[1]["foo"].ToString();
无论如何你必须提供这个名字。然而,变量名称并不意味着什么,只是随意而言更具可读性。
为什么不创建一个名称列表,而不是依赖于变量名称,而不是通过该列表中的元素来访问行?
var myList = new List<string> {"foo", "bar", ... };
现在您可以循环列表并获取行值:
foreach(var name in myList)
{
var a = testData.Rows[1][name].ToString();
// do something with a
}
答案 1 :(得分:2)
您可能希望一个类来表示行中的数据。然后,您可以使用反射或序列化来填充具有这些属性的对象。这是使用简单反射的可能性:
class MyRow
{
public string foo { get; set; }
public string bar { get; set; }
}
var row = testData.Rows[1];
var myRow = new MyRow();
foreach (DataColumn col in testData.Columns)
{
var prop = typeof(MyRow).GetProperty(col.ColumnName);
prop.SetValue(myRow, (string)(row[col] ?? string.Empty), null);
}
您现在拥有一个属性为foo
和bar
的对象。
或者,使用序列化,看起来DataTable
很好地序列化为对象集合,因此您可以序列化整个表,然后在反序列化表后获取所需的记录:
var tableJson = JsonConvert.SerializeObject(testData);
myRow = JsonConvert.DeserializeObject<MyRow[]>(tableJson)[1];
答案 2 :(得分:0)
循环显示列:
foreach(DataColumn col in testData.Columns)
{
var colValue = testData.Rows[1][col.ColumnName];
}