Проверьте, существует ли переменная
Я строю программу на C# с использованием Visual Studio 2010. И мне было интересно, есть ли способ проверить, существует ли переменная.
Так что в основном мой main.cs
вызывает несколько других файлов (file1.cs
, file2.cs
, file3.cs
, так далее). Каждый из этих файлов очень похож, но в некоторых отсутствуют некоторые переменные.
Например, var v1
существует в file1.cs
а также file2.cs
, но нет file3.cs
В моем main.cs
Это что-то вроде этого.
string a = MyProgram.file1.v1;
string b = MyProgram.file2.v1;
string c = MyProgram.file3.v1; //will break here
Я знаю, что приведенный выше код, вероятно, не будет работать вообще, но это была идея.
Есть ли способ проверить, существует ли v1 в file3.cs? Может быть как то так
string c = VarExist(MyProgram.file3.v1) ? MyProgram.file3.v1 : "variable not exist";
Я пытался использовать try-catch, но код даже не скомпилируется с этим методом.
РЕДАКТИРОВАТЬ
Я знаю, что переменная не существует, но есть ли способ для самой программы проверить это?
В моем файле main.cs он просматривает эти файлы и применяет одну и ту же операцию. Я хочу, чтобы он мог делать что-то вроде этого:
foreach (file in files) //loop through file1.cs - file3.cs
{
if (file.v1 exist)
//do action1
if (file.v2 exist)
//do action2
if (file.v3 exist)
//do action3
//....
}
Прямо сейчас программа даже не скомпилируется, мне нужно будет создать v1 в file3.cs и установить его в null. Это было временное решение, потому что для других частей / функций этой программы требуется, чтобы v1 НЕ находился в file3.cs (и нет, я не могу изменить это, потому что это то, что было настроено предыдущей разработкой, и я не знаю код достаточно хорошо, чтобы изменить его)
Это довольно большое решение, поэтому я извиняюсь, что не могу опубликовать реальный код. Спасибо всем за то время, что я действительно ценю это.
2 ответа
Согласно комментариям, вы можете добавить свои элементы в список, как это:
var files = new List<userRule>()
{
MyProgram.file1,
MyProgram.file2,
MyProgram.file3
};
Это может быть сделано, потому что тип этих "файлов" наследуется от userRule.
Теперь вы можете перебирать с помощью:
foreach (file in files)
{
//something
}
Для проверки сделайте это:
foreach (file in files)
{
var property = file.GetType().GetProperty("v1");
if (property == null)
{
// it doesn't have the property
}
else
{
// it has the property
// read it:
var v1 = property.GetValue(file, null);
// write it:
property.SetValue(file, v1, null);
}
}
Если вам действительно нужно сделать это таким образом, вы можете использовать reflection
, Имейте в виду, отражение медленное, хотя. После этого вы сможете использовать try/catch каждый раз, когда пытаетесь получить значение свойства.
То, что вы называете "переменными", должно быть properties
или же methods
определяется (или нет) в каждом из модулей вашего класса (file1.cs, file2.cs и т. д.)