获取变量的名称而不调用它

时间:2016-12-09 14:05:41

标签: c# .net datatable

我有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();

有可能吗?

3 个答案:

答案 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);
}

您现在拥有一个属性为foobar的对象。

或者,使用序列化,看起来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];
}