2016-12-09 3 views
0

У меня есть 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(); 

Но я не хочу называть имя переменной каждый раз, когда я хотел бы использовать somethink так:

string foo = testData.Rows[1][nameof(this)].ToString(); 
string bar = testData.Rows[1][nameof(this)].ToString(); 

Возможно ли это?

+5

Выглядит как XY-проблема для меня. Что такое * актуальная * проблема, которую вы пытаетесь решить? Зачем вам вообще нужно извлекать данные для какой-либо именованной переменной? –

+1

Когда какое-либо конкретное выражение анализируется, компилятор не учитывает, находится ли это конкретное выражение в правой части оператора присваивания. Это, конечно, не приводит к какой-либо информации в качестве своего рода контекста. –

+0

@Damien_The_Unbeliever, это лучший ответ на мой вопрос - это невозможно, и теперь я знаю почему. – kotoj

ответ

2

Почему вы considder

string foo = testData.Rows[1][nameof(foo)].ToString(); 

мне более элегантно, чем

string anyName = testData.Rows[1]["foo"].ToString(); 

You'd должны указать имя в любом случае. Однако имена переменных не означают ничего и просто произвольны, чтобы быть более читабельными.

Вместо того чтобы полагаться на переменные имена, почему бы не создать список имен и не получить доступ к строкам элементами в этом списке?

var myList = new List<string> {"foo", "bar", ... }; 

Теперь вы можете просто цикл ваш список и получить значение строки:

foreach(var name in myList) 
{ 
    var a = testData.Rows[1][name].ToString(); 
    // do something with a 
} 
+0

Благодарим вас за помощь.Мои соображения были вызваны тем, что я инициализировал переменные по-разному. Я, вероятно, буду использовать словарь, который будет лучшим вариантом в моем случае. Но вопрос был в том, могу ли я получить имя переменной во время назначения, а ответ - нет. – kotoj

0

цикл по колонкам:

foreach(DataColumn col in testData.Columns) 
{ 
    var colValue = testData.Rows[1][col.ColumnName]; 
} 
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]; 
+0

Благодарим вас за помощь. В моем случае я, вероятно, буду использовать «Словарь». Вопрос заключался в использовании 'nameof' во время назначения. И я узнал, что это невозможно – kotoj

Смежные вопросы